diff --git a/github/MainClass.py b/github/MainClass.py index 6bf41951..8cf58617 100644 --- a/github/MainClass.py +++ b/github/MainClass.py @@ -72,6 +72,7 @@ import Invitation atLeastPython3 = sys.hexversion >= 0x03000000 DEFAULT_BASE_URL = "https://api.github.com" +DEFAULT_STATUS_URL = "https://status.github.com" # As of 2018-05-17, Github imposes a 10s limit for completion of API requests. # Thus, the timeout should be slightly > 10s to account for network/front-end # latency. @@ -625,8 +626,7 @@ class Github(object): """ headers, attributes = self.__requester.requestJsonAndCheck( "GET", - "/api/status.json", - cnx="status" + DEFAULT_STATUS_URL + "/api/status.json" ) return Status.Status(self.__requester, headers, attributes, completed=True) @@ -639,8 +639,7 @@ class Github(object): """ headers, attributes = self.__requester.requestJsonAndCheck( "GET", - "/api/last-message.json", - cnx="status" + DEFAULT_STATUS_URL + "/api/last-message.json" ) return StatusMessage.StatusMessage(self.__requester, headers, attributes, completed=True) @@ -653,8 +652,7 @@ class Github(object): """ headers, data = self.__requester.requestJsonAndCheck( "GET", - "/api/messages.json", - cnx="status" + DEFAULT_STATUS_URL + "/api/messages.json" ) return [StatusMessage.StatusMessage(self.__requester, headers, attributes, completed=True) for attributes in data] diff --git a/github/Requester.py b/github/Requester.py index 7dbb7d92..6f774407 100644 --- a/github/Requester.py +++ b/github/Requester.py @@ -254,16 +254,14 @@ class Requester: self.__apiPreview = api_preview self.__verify = verify - def requestJsonAndCheck(self, verb, url, parameters=None, headers=None, input=None, cnx=None): - return self.__check(*self.requestJson(verb, url, parameters, headers, input, cnx)) + def requestJsonAndCheck(self, verb, url, parameters=None, headers=None, input=None): + return self.__check(*self.requestJson(verb, url, parameters, headers, input, self.__customConnection(url))) def requestMultipartAndCheck(self, verb, url, parameters=None, headers=None, input=None): - return self.__check(*self.requestMultipart(verb, url, parameters, headers, input)) + return self.__check(*self.requestMultipart(verb, url, parameters, headers, input, self.__customConnection(url))) def requestBlobAndCheck(self, verb, url, parameters=None, headers=None, input=None): - o = urlparse.urlparse(url) - self.__hostname = o.hostname - return self.__check(*self.requestBlob(verb, url, parameters, headers, input)) + return self.__check(*self.requestBlob(verb, url, parameters, headers, input, self.__customConnection(url))) def __check(self, status, responseHeaders, output): output = self.__structuredFromJson(output) @@ -271,6 +269,19 @@ class Requester: raise self.__createException(status, responseHeaders, output) return responseHeaders, output + def __customConnection(self, url): + cnx = None + if not url.startswith("/"): + o = urlparse.urlparse(url) + if o.hostname != self.__hostname or \ + (o.port and o.port != self.__port) or \ + (o.scheme != self.__scheme and not (o.scheme == "https" and self.__scheme == "http")): # issue80 + if o.scheme == 'http': + cnx = self.__httpConnectionClass(o.hostname, o.port) + elif o.scheme == 'https': + cnx = self.__httpsConnectionClass(o.hostname, o.port) + return cnx + def __createException(self, status, headers, output): if status == 401 and output.get("message") == "Bad credentials": cls = GithubException.BadCredentialsException @@ -303,7 +314,7 @@ class Requester: return self.__requestEncode(cnx, verb, url, parameters, headers, input, encode) - def requestMultipart(self, verb, url, parameters=None, headers=None, input=None): + def requestMultipart(self, verb, url, parameters=None, headers=None, input=None, cnx=None): def encode(input): boundary = "----------------------------3c3ba8b523b2" eol = "\r\n" @@ -317,9 +328,9 @@ class Requester: encoded_input += "--" + boundary + "--" + eol return "multipart/form-data; boundary=" + boundary, encoded_input - return self.__requestEncode(None, verb, url, parameters, headers, input, encode) + return self.__requestEncode(cnx, verb, url, parameters, headers, input, encode) - def requestBlob(self, verb, url, parameters={}, headers={}, input=None): + def requestBlob(self, verb, url, parameters={}, headers={}, input=None, cnx=None): def encode(local_path): if "Content-Type" in headers: mime_type = headers["Content-Type"] @@ -331,7 +342,7 @@ class Requester: if input: headers["Content-Length"] = str(os.path.getsize(input)) - return self.__requestEncode(None, verb, url, parameters, headers, input, encode) + return self.__requestEncode(cnx, verb, url, parameters, headers, input, encode) def __requestEncode(self, cnx, verb, url, parameters, requestHeaders, input, encode): assert verb in ["HEAD", "GET", "POST", "PATCH", "PUT", "DELETE"] @@ -372,9 +383,6 @@ class Requester: original_cnx = cnx if cnx is None: cnx = self.__createConnection() - else: - assert cnx == "status" - cnx = self.__httpsConnectionClass("status.github.com", 443) cnx.request( verb, url, @@ -413,8 +421,8 @@ class Requester: url = self.__prefix + url else: o = urlparse.urlparse(url) - assert o.hostname in [self.__hostname, "uploads.github.com"], o.hostname - assert o.path.startswith((self.__prefix, "/api/uploads")) + assert o.hostname in [self.__hostname, "uploads.github.com", "status.github.com"], o.hostname + assert o.path.startswith((self.__prefix, "/api/")) assert o.port == self.__port url = o.path if o.query != "": diff --git a/github/tests/ReplayData/ExposeAllAttributes.testAllClasses.txt b/github/tests/ReplayData/ExposeAllAttributes.testAllClasses.txt index 4c4752c5..0e5a9d81 100644 --- a/github/tests/ReplayData/ExposeAllAttributes.testAllClasses.txt +++ b/github/tests/ReplayData/ExposeAllAttributes.testAllClasses.txt @@ -265,7 +265,7 @@ None https GET status.github.com -443 +None /api/status.json {'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} None @@ -276,7 +276,7 @@ None https GET status.github.com -443 +None /api/last-message.json {'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} None diff --git a/github/tests/ReplayData/Status.testGetLastMessage.txt b/github/tests/ReplayData/Status.testGetLastMessage.txt index 07e9b678..e858a5f0 100644 --- a/github/tests/ReplayData/Status.testGetLastMessage.txt +++ b/github/tests/ReplayData/Status.testGetLastMessage.txt @@ -1,7 +1,7 @@ https GET status.github.com -443 +None /api/last-message.json {'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} None diff --git a/github/tests/ReplayData/Status.testGetMessages.txt b/github/tests/ReplayData/Status.testGetMessages.txt index 076c3dbd..3399aca6 100644 --- a/github/tests/ReplayData/Status.testGetMessages.txt +++ b/github/tests/ReplayData/Status.testGetMessages.txt @@ -1,7 +1,7 @@ https GET status.github.com -443 +None /api/messages.json {'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} None diff --git a/github/tests/ReplayData/Status.testGetStatus.txt b/github/tests/ReplayData/Status.testGetStatus.txt index faa3da5a..c2518a0a 100644 --- a/github/tests/ReplayData/Status.testGetStatus.txt +++ b/github/tests/ReplayData/Status.testGetStatus.txt @@ -1,7 +1,7 @@ https GET status.github.com -443 +None /api/status.json {'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} None