def test_garbage_in(self): # Connect without SSL regardless of server.scheme c = HTTPConnection('%s:%s' % (self.interface(), self.PORT)) c._output(b'gjkgjklsgjklsgjkljklsg') c._send_output() response = c.response_class(c.sock, method="GET") try: response.begin() self.assertEqual(response.status, 400) self.assertEqual(response.fp.read(22), b"Malformed Request-Line") c.close() except socket.error: e = sys.exc_info()[1] # "Connection reset by peer" is also acceptable. if e.errno != errno.ECONNRESET: raise
def test_content_length_required(self): # Now send a message that has no Content-Length, but does send a body. # Verify that CP times out the socket and responds # with 411 Length Required. if self.scheme == "https": c = HTTPSConnection('%s:%s' % (self.interface(), self.PORT)) else: c = HTTPConnection('%s:%s' % (self.interface(), self.PORT)) c.request("POST", "/body_required") response = c.getresponse() self.body = response.fp.read() self.status = str(response.status) self.assertStatus(411)
def test_http_to_https(self): # Test what happens when a client tries to speak HTTP to an HTTPS # server msg = ("The client sent a plain HTTP request, but this " "server only speaks HTTPS on this port.") c = HTTPConnection('%s:%s' % (self.interface(), self.PORT)) c.putrequest("GET", "/hello") c.endheaders() try: response = c.getresponse() except socket.error: pass else: self.status, self.headers, self.body = webtest.shb(response) c.close() self.assertStatus(400) self.assertBody(msg) self.assertInLog(msg)
def test_chunked_request_payload_readline(self): if self.scheme == "https": c = HTTPSConnection('%s:%s' % (self.interface(), self.PORT)) else: c = HTTPConnection('%s:%s' % (self.interface(), self.PORT)) c.putrequest("POST", "/echo_lines") c.putheader("Transfer-Encoding", "chunked") c.endheaders() c.send(b"13\r\nI am a\nrequest body\r\n0\r\n\r\n") response = c.getresponse() self.status, self.headers, self.body = webtest.shb(response) c.close() self.assertStatus(200) self.assertBody("I am a\nrequest body")
def test_request_payload_readline(self): if self.scheme == "https": c = HTTPSConnection('%s:%s' % (self.interface(), self.PORT)) else: c = HTTPConnection('%s:%s' % (self.interface(), self.PORT)) c.putrequest("POST", "/echo_lines") body = b"I am a\nrequest body" c.putheader("Content-Length", len(body)) c.endheaders() c.send(body) response = c.getresponse() self.status, self.headers, self.body = webtest.shb(response) c.close() self.assertStatus(200) self.assertBody(body)
def test_malformed_header(self): if self.scheme == 'https': c = HTTPSConnection('%s:%s' % (self.interface(), self.PORT)) else: c = HTTPConnection('%s:%s' % (self.interface(), self.PORT)) c.putrequest('GET', '/') c.putheader('Content-Type', 'text/plain') # See http://www.bitbucket.org/cherrypy/cherrypy/issue/941 c._output(b'Re, 1.2.3.4#015#012') c.endheaders() response = c.getresponse() self.status = str(response.status) self.assertStatus(400) self.body = response.fp.read(20) self.assertBody("Illegal header line.")
def test_no_content_length(self): # "The presence of a message-body in a request is signaled by the # inclusion of a Content-Length or Transfer-Encoding header field in # the request's message-headers." # # Send a message with neither header and no body. if self.scheme == "https": c = HTTPSConnection('%s:%s' % (self.interface(), self.PORT)) else: c = HTTPConnection('%s:%s' % (self.interface(), self.PORT)) c.request("POST", "/no_body") response = c.getresponse() self.body = response.fp.read() self.status = str(response.status) self.assertStatus(200) self.assertBody(b'Hello world!')
def test_max_body(self): if self.scheme == "https": c = HTTPSConnection('%s:%s' % (self.interface(), self.PORT)) else: c = HTTPConnection('%s:%s' % (self.interface(), self.PORT)) c.putrequest("POST", "/echo") body = b"x" * 1001 c.putheader("Content-Length", len(body)) c.endheaders() c.send(body) response = c.getresponse() self.status, self.headers, self.body = webtest.shb(response) c.close() self.assertStatus(413) self.assertBody("The entity sent with the request exceeds " "the maximum allowed bytes.")
def test_malformed_request_line(self): # Test missing version in Request-Line if self.scheme == 'https': c = HTTPSConnection('%s:%s' % (self.interface(), self.PORT)) else: c = HTTPConnection('%s:%s' % (self.interface(), self.PORT)) c._output(b'GET /') c._send_output() if hasattr(c, 'strict'): response = c.response_class(c.sock, strict=c.strict, method='GET') else: # Python 3.2 removed the 'strict' feature, saying: # "http.client now always assumes HTTP/1.x compliant servers." response = c.response_class(c.sock, method='GET') response.begin() self.assertEqual(response.status, 400) self.assertEqual(response.fp.read(22), b"Malformed Request-Line") c.close()
def __init__(self, path=None): self.path = path HTTPConnection.__init__(self, host="localhost", port=80)