Source

CherryPy / cherrypy / test / test_http.py

The branch 'cherrypy-3.1.x' does not exist.
Robert Brewer 2a033ff 
Robert Brewer 38dc014 
Robert Brewer 3f1e91a 
Robert Brewer 38dc014 



Robert Brewer 4914205 
Robert Brewer 11efeb5 






Robert Brewer 4cda8b8 
Robert Brewer 11efeb5 













Robert Brewer 38dc014 

Robert Brewer dacf95a 
Robert Brewer 294c3b3 
Robert Brewer dacf95a 



Robert Brewer 11efeb5 

Robert Brewer 4914205 
Robert Brewer 11efeb5 
Robert Brewer 4914205 













Robert Brewer 11efeb5 
Robert Brewer 8256d9b 
Robert Brewer dacf95a 
Robert Brewer 4cda8b8 

Robert Brewer dacf95a 
Robert Brewer 38dc014 
Robert Brewer 3f1e91a 
Robert Brewer 38dc014 



Robert Brewer 294c3b3 


Robert Brewer 4914205 
Robert Brewer 7c4907c 
Robert Brewer 4914205 
Robert Brewer 7c4907c 
Robert Brewer 294c3b3 

Robert Brewer 11efeb5 

Robert Brewer 4914205 
Robert Brewer 11efeb5 
Robert Brewer 4914205 
Robert Brewer 11efeb5 






Robert Brewer 7c4907c 
Robert Brewer 11efeb5 
Robert Brewer 7c4907c 
Robert Brewer 11efeb5 









Robert Brewer 4914205 

Robert Brewer 3932b98 
Robert Brewer 2e1f069 
Robert Brewer 946d15d 



Robert Brewer 2e1f069 

Robert Brewer 7c4907c 
Robert Brewer 2e1f069 
Robert Brewer 7c4907c 
Robert Brewer 2e1f069 







Robert Brewer 3932b98 
Robert Brewer 38dc014 
Robert Brewer dacf95a 
"""Tests for managing HTTP issues (malformed requests, etc)."""

from cherrypy.test import test
test.prefer_parent_path()

import httplib
import cherrypy
import mimetypes


def encode_multipart_formdata(files):
    """Return (content_type, body) ready for httplib.HTTP instance.
    
    files: a sequence of (name, filename, value) tuples for multipart uploads.
    """
    BOUNDARY = '________ThIs_Is_tHe_bouNdaRY_$'
    L = []
    for key, filename, value in files:
        L.append('--' + BOUNDARY)
        L.append('Content-Disposition: form-data; name="%s"; filename="%s"' %
                 (key, filename))
        ct = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
        L.append('Content-Type: %s' % ct)
        L.append('')
        L.append(value)
    L.append('--' + BOUNDARY + '--')
    L.append('')
    body = '\r\n'.join(L)
    content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
    return content_type, body


def setup_server():
    
    class Root:
        def index(self, *args, **kwargs):
            return "Hello world!"
        index.exposed = True
        
        def post_multipart(self, file):
            """Return a summary ("a * 65536\nb * 65536") of the uploaded file."""
            contents = file.file.read()
            summary = []
            curchar = ""
            count = 0
            for c in contents:
                if c == curchar:
                    count += 1
                else:
                    if count:
                        summary.append("%s * %d" % (curchar, count))
                    count = 1
                    curchar = c
            if count:
                summary.append("%s * %d" % (curchar, count))
            return ", ".join(summary)
        post_multipart.exposed = True
    
    cherrypy.tree.mount(Root())
    cherrypy.config.update({'environment': 'test_suite',
                            'server.max_request_body_size': 30000000})


from cherrypy.test import helper

class HTTPTests(helper.CPWebCase):
    
    def test_sockets(self):
        # By not including a Content-Length header, cgi.FieldStorage
        # will hang. Verify that CP times out the socket and responds
        # with 411 Length Required.
        if self.scheme == "https":
            c = httplib.HTTPSConnection('%s:%s' % (self.interface(), self.PORT))
        else:
            c = httplib.HTTPConnection('%s:%s' % (self.interface(), self.PORT))
        c.request("POST", "/")
        self.assertEqual(c.getresponse().status, 411)
    
    def test_post_multipart(self):
        alphabet = "abcdefghijklmnopqrstuvwxyz"
        # generate file contents for a large post
        contents = "".join([c * 65536 for c in alphabet])
        
        # encode as multipart form data
        files=[('file', 'file.txt', contents)]
        content_type, body = encode_multipart_formdata(files)
        
        # post file
        if self.scheme == 'https':
            c = httplib.HTTPS('%s:%s' % (self.interface(), self.PORT))
        else:
            c = httplib.HTTP('%s:%s' % (self.interface(), self.PORT))
        c.putrequest('POST', '/post_multipart')
        c.putheader('Content-Type', content_type)
        c.putheader('Content-Length', str(len(body)))
        c.endheaders()
        c.send(body)
        
        errcode, errmsg, headers = c.getreply()
        self.assertEqual(errcode, 200)
        
        response_body = c.file.read()
        self.assertEquals(", ".join(["%s * 65536" % c for c in alphabet]),
                          response_body)

    def test_malformed_request_line(self):
        if getattr(cherrypy.server, "using_apache", False):
            print "skipped due to known Apache differences...",
            return
        
        # Test missing version in Request-Line
        if self.scheme == 'https':
            c = httplib.HTTPSConnection('%s:%s' % (self.interface(), self.PORT))
        else:
            c = httplib.HTTPConnection('%s:%s' % (self.interface(), self.PORT))
        c._output('GET /')
        c._send_output()
        response = c.response_class(c.sock, strict=c.strict, method='GET')
        response.begin()
        self.assertEqual(response.status, 400)
        self.assertEqual(response.fp.read(), "Malformed Request-Line")
        c.close()


if __name__ == '__main__':
    setup_server()
    helper.testmain()
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.