Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #3
0
 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")