def FetchResponse(self, path, method, headers, request_body): """This is a callback method used to fetch a response. This method is called by the FakeCurl.perform method @type path: string @param path: Requested path @type method: string @param method: HTTP method @type request_body: string @param request_body: Request body @type headers: mimetools.Message @param headers: Request headers @return: Tuple containing status code, response headers and response body """ req_msg = http.HttpMessage() req_msg.start_line = \ http.HttpClientToServerStartLine(method, path, http.HTTP_1_0) req_msg.headers = headers req_msg.body = request_body (_, _, _, resp_msg) = \ http.server.HttpResponder(self.handler)(lambda: (req_msg, None)) return (resp_msg.start_line.code, resp_msg.headers, resp_msg.body)
def ParseStartLine(self, start_line): """Parses the start line sent by client. Example: "GET /index.html HTTP/1.1" @type start_line: string @param start_line: Start line """ # Empty lines are skipped when reading assert start_line logging.debug("HTTP request: %s", start_line) words = start_line.split() if len(words) == 3: [method, path, version] = words if version[:5] != "HTTP/": raise http.HttpBadRequest("Bad request version (%r)" % version) try: base_version_number = version.split("/", 1)[1] version_number = base_version_number.split(".") # RFC 2145 section 3.1 says there can be only one "." and # - major and minor numbers MUST be treated as # separate integers; # - HTTP/2.4 is a lower version than HTTP/2.13, which in # turn is lower than HTTP/12.3; # - Leading zeros MUST be ignored by recipients. if len(version_number) != 2: raise http.HttpBadRequest("Bad request version (%r)" % version) version_number = (int(version_number[0]), int(version_number[1])) except (ValueError, IndexError): raise http.HttpBadRequest("Bad request version (%r)" % version) if version_number >= (2, 0): raise http.HttpVersionNotSupported( "Invalid HTTP Version (%s)" % base_version_number) elif len(words) == 2: version = http.HTTP_0_9 [method, path] = words if method != http.HTTP_GET: raise http.HttpBadRequest("Bad HTTP/0.9 request type (%r)" % method) else: raise http.HttpBadRequest("Bad request syntax (%r)" % start_line) return http.HttpClientToServerStartLine(method, path, version)
def testClientToServerStartLine(self): """Test client to server start line (HTTP request)""" start_line = http.HttpClientToServerStartLine("GET", "/", "HTTP/1.1") self.assertEqual(str(start_line), "GET / HTTP/1.1")