def setup_server(cls): class Root(helper.Controller): def hello(self, req, resp): return "hello" cls.httpserver.wsgi_app = Root() cls.httpserver.ssl_adapter = helper.get_ssl_adapter(cls.adapter) context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) context.check_hostname = False context.verify_mode = ssl.CERT_NONE cls.HTTP_CONN = HTTPSConnection(webtest.interface(cls.HOST), cls.PORT, context=context) cls.scheme = 'https'
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_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_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_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 test_chunked_request_payload_trailer(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" b"Content-Type: application/json\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") self.assertHeader("Content-Type", "application/json")
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_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.")