CherryPy / cherrypy / test /

"""Tests for various MIME issues, including the safe_multipart Tool."""

import cherrypy
from cherrypy._cpcompat import ntob, ntou, sorted

def setup_server():

    class Root:

        def multipart(self, parts):
            return repr(parts) = True

        def multipart_form_data(self, **kwargs):
            return repr(list(sorted(kwargs.items()))) = True

        def flashupload(self, Filedata, Upload, Filename):
            return ("Upload: %s, Filename: %s, Filedata: %r" %
                    (Upload, Filename, = True

    cherrypy.config.update({'server.max_request_body_size': 0})

#                             Client-side code                             #

from cherrypy.test import helper

class MultipartTest(helper.CPWebCase):
    setup_server = staticmethod(setup_server)

    def test_multipart(self):
        text_part = ntou("This is the text version")
        html_part = ntou("""<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<body bgcolor="#ffffff" text="#000000">

This is the <strong>HTML</strong> version
        body = '\r\n'.join([
            "Content-Type: text/plain; charset='ISO-8859-1'",
            "Content-Transfer-Encoding: 7bit",
            "Content-Type: text/html; charset='ISO-8859-1'",
        headers = [
            ('Content-Type', 'multipart/mixed; boundary=123456789'),
            ('Content-Length', str(len(body))),
        self.getPage('/multipart', headers, "POST", body)
        self.assertBody(repr([text_part, html_part]))

    def test_multipart_form_data(self):
                          'Content-Disposition: form-data; name="foo"',
                          # Test a param with more than one value.
                          # See
                          'Content-Disposition: form-data; name="baz"',
                          'Content-Disposition: form-data; name="baz"',
        self.getPage('/multipart_form_data', method='POST',
                     headers=[("Content-Type", "multipart/form-data;boundary=X"),
                              ("Content-Length", str(len(body))),
        self.assertBody(repr([('baz', [ntou('111'), ntou('333')]), ('foo', ntou('bar'))]))

class SafeMultipartHandlingTest(helper.CPWebCase):
    setup_server = staticmethod(setup_server)

    def test_Flash_Upload(self):
        headers = [
            ('Accept', 'text/*'),
            ('Content-Type', 'multipart/form-data; '
            ('User-Agent', 'Shockwave Flash'),
            ('Host', ''),
            ('Content-Length', '499'),
            ('Connection', 'Keep-Alive'),
            ('Cache-Control', 'no-cache'),
        filedata = ntob('<?xml version="1.0" encoding="UTF-8"?>\r\n'
        body = (ntob(
            'Content-Disposition: form-data; name="Filename"\r\n'
            'Content-Disposition: form-data; '
                'name="Filedata"; filename=".project"\r\n'
            'Content-Type: application/octet-stream\r\n'
            + filedata +
            'Content-Disposition: form-data; name="Upload"\r\n'
            'Submit Query\r\n'
            # Flash apps omit the trailing \r\n on the last line:
        self.getPage('/flashupload', headers, "POST", body)
        self.assertBody("Upload: Submit Query, Filename: .project, "
                        "Filedata: %r" % filedata)
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
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.