def recv(self, wsgi=False):
        try:
            stream = HttpStream(self.reader, kind=HTTP_REQUEST, parser_class=HttpParser, decompress=True)

            if bool(wsgi):
                environ = stream.wsgi_environ()
                environ['wsgi.url_scheme'] = guess_scheme(environ)
                environ['wsgi.input'] = stream.body_file()
                environ['wsgi.socket'] = self.socket
                return environ

            # BUG:
            # http-parser has an issue here, if we call 'method' before 'headers'
            # and invalid method name is returned...
            fields  = stream.headers()
            method  = stream.method()
            url     = stream.url()
            version = stream.version()
            content = stream.body_file()

            url      = urlparse(url)
            path     = url.path
            query    = parse_qs(url.query, keep_blank_values=True)
            fragment = url.fragment

            for k, v in six.iteritems(dict(query)):
                query[k] = parse_query_value(v)

            self.version = 'HTTP/%s.%s' % version
            return method, path, query, fragment, fields, content
        except NoMoreData:
            pass
 def __init__(self, environ, start_response):
     self.__environ = environ
     self.__start_response = start_response
     self.__response_sent_p = False
     self.__buffer = ''
     self.__low_level_headers = []
     self.__headers = table(self.__low_level_headers)
     self.__headers.add = self.__headers.add_header
     self.__status = "200 OK"
     self.__filename = None
     self.__disposition_type = None
     self.__bytes_sent = 0
     self.__allowed_methods = []
     self.__cleanups = []
     self.headers_out = self.__headers
     ## See: <http://www.python.org/dev/peps/pep-0333/#the-write-callable>
     self.__write = None
     self.__write_error = False
     self.__errors = environ['wsgi.errors']
     self.__headers_in = table([])
     self.__tainted = False
     self.__is_https = int(guess_scheme(self.__environ) == 'https')
     self.__replace_https = False
     self.track_writings = False
     self.__what_was_written = ""
     for key, value in environ.iteritems():
         if key.startswith('HTTP_'):
             self.__headers_in[key[len('HTTP_'):].replace('_', '-')] = value
     if environ.get('CONTENT_LENGTH'):
         self.__headers_in['content-length'] = environ['CONTENT_LENGTH']
     if environ.get('CONTENT_TYPE'):
         self.__headers_in['content-type'] = environ['CONTENT_TYPE']
Beispiel #3
0
def main(argv=sys.argv):
    """
    Run the WSGI application using :mod:`wsgiref`.
    """
    args = docopt.docopt(__doc__, argv[1:], version=__version__)

    if args['--print-template']:
        six.print_(DEFAULT_FRONTPAGE)
        return 0

    host = args['--host']
    port = int(args['--port'])
    store = os.path.realpath(os.path.expanduser(args['--store']))
    template = args['--template']

    if 0 > port > 65535:
        six.print_('Bad port: {0}'.format(port), file=sys.stderr)
        return 1

    try:
        app = create_application(None, store=store, template=template)
    except BadPath as exc:
        six.print_(exc.message, file=sys.stderr)
        return 1

    logging.basicConfig(level=logging.INFO, stream=sys.stderr)

    from wsgiref.util import guess_scheme
    scheme = guess_scheme(os.environ)
    six.print_("Serving on {0}://{1}:{2}/".format(scheme, host, port),
               file=sys.stderr)

    from wsgiref.simple_server import make_server
    make_server(host, port, app).serve_forever()
    return 0
Beispiel #4
0
def _getURL(env, local, full=False):
    
    url = urlparse.urljoin(env['SCRIPT_NAME'], local)

    if full:
        url = urlparse.urljoin("%s://%s" % (guess_scheme(env), env['HTTP_HOST']), url)

    return url
Beispiel #5
0
 def wrapped(environ, start_response):
     domain = os.environ.get('DOMAIN')
     if domain and environ['HTTP_HOST'] != domain:
         path = environ.get('PATH_INFO', '')
         protocol = guess_scheme(environ)
         start_response('301 Redirect', [('Location', '%s://%s%s' % (protocol, domain, path)),])
         return []
     return fn(environ, start_response)
Beispiel #6
0
def get_path(environ):
    """
    Get the path
    """
    from wsgiref import util
    request_uri = environ.get('REQUEST_URI', environ.get('RAW_URI', ''))
    if request_uri == '':
        uri = util.request_uri(environ)
        host = environ.get('HTTP_HOST', '')
        scheme = util.guess_scheme(environ)
        prefix = "{scheme}://{host}".format(scheme=scheme, host=host)
        request_uri = uri.replace(prefix, '')
    return request_uri
Beispiel #7
0
 def _metadata(self):
     environ = self.filtered_environ
     data = {}
     data['HTTP_SCHEME'] = guess_scheme(environ)
     cgi_vars = data['CGI Variables'] = {}
     wsgi_vars = data['WSGI Variables'] = {}
     hide_vars = ['wsgi.errors', 'wsgi.input',
                  'wsgi.multithread', 'wsgi.multiprocess',
                  'wsgi.run_once', 'wsgi.version',
                  'wsgi.url_scheme', 'webob._parsed_cookies']
     for name, value in environ.items():
         if name.upper() == name:
             if name in os.environ:  # Skip OS environ variables
                 continue
             if value:
                 cgi_vars[name] = value
         elif name not in hide_vars:
             wsgi_vars[name] = value
     proc_desc = tuple([int(bool(environ[key]))
                        for key in ('wsgi.multiprocess',
                                    'wsgi.multithread',
                                    'wsgi.run_once')])
     wsgi_vars['wsgi process'] = self.process_combos[proc_desc]
     return {'fields': data, 'filter_sensitive': self._filter_sensitive}
 def is_https(self):
     scheme = self.__environ.get('wsgi.url_scheme', guess_scheme(self.__environ))
     return int(scheme == 'https')
 def get_scheme(self):
     """Return the URL scheme being used"""
     return guess_scheme(self.environ)
Beispiel #10
0
 def testGuessScheme(self):
     self.assertEqual(util.guess_scheme({}), "http")
     self.assertEqual(util.guess_scheme({'HTTPS': "foo"}), "http")
     self.assertEqual(util.guess_scheme({'HTTPS': "on"}), "https")
     self.assertEqual(util.guess_scheme({'HTTPS': "yes"}), "https")
     self.assertEqual(util.guess_scheme({'HTTPS': "1"}), "https")
 def is_https(self):
     scheme = self.__environ.get("wsgi.url_scheme", guess_scheme(self.__environ))
     return int(scheme == "https")
Beispiel #12
0
 def is_https(self):
     scheme = self.__environ.get('wsgi.url_scheme',
                                 guess_scheme(self.__environ))
     return int(scheme == 'https')
Beispiel #13
0
 def scheme(self):
     return (self.environ["wsgi.url_scheme"] if "wsgi.url_scheme"
             in self.environ else wsgiutil.guess_scheme(self.environ))
Beispiel #14
0
 def scheme(self):
     """Return HTTP Request Scheme (http|https)."""
     return wsgiutil.guess_scheme(self.environ)
Beispiel #15
0
 def is_https(self):
     return int(guess_scheme(self.__environ) == "https")
Beispiel #16
0
 def get_scheme(self):
     """Return the URL scheme being used"""
     return guess_scheme(self.environ)
Beispiel #17
0
 def testGuessScheme(self):
     self.assertEqual(util.guess_scheme({}), "http")
     self.assertEqual(util.guess_scheme({'HTTPS':"foo"}), "http")
     self.assertEqual(util.guess_scheme({'HTTPS':"on"}), "https")
     self.assertEqual(util.guess_scheme({'HTTPS':"yes"}), "https")
     self.assertEqual(util.guess_scheme({'HTTPS':"1"}), "https")
Beispiel #18
0
def main(argv=sys.argv):
    """
    Run the WSGI application using :mod:`wsgiref`.
    """
    parser = argparse.ArgumentParser(description="A PyPI-style documentation server.")
    parser.add_argument(
        "--host",
        help="hostname or address to bind server to",
        default="localhost",
    )
    parser.add_argument(
        "--port",
        help="port to run server on",
        type=int,
        default=8080,
    )
    parser.add_argument(
        "--store",
        help="path to bundle store directory",
        default="~/docstore",
    )
    parser.add_argument(
        "--template",
        help="path to frontpage template",
        type=str,
    )
    parser.add_argument(
        "--print-template",
        action="store_true",
    )
    args = parser.parse_args()

    if args.print_template:
        print(DEFAULT_FRONTPAGE)
        return 0

    print(args)
    store = os.path.realpath(os.path.expanduser(args.store))

    if 0 > args.port > 65535:
        print("Bad port:", args.port, file=sys.stderr)
        return 1

    try:
        app = create_application(None, store=store, template=args.template)
    except BadPath as exc:
        print(exc, file=sys.stderr)
        return 1

    logging.basicConfig(level=logging.INFO, stream=sys.stderr)

    from wsgiref.util import guess_scheme

    scheme = guess_scheme(os.environ)
    print(
        "Serving on {}://{}:{}/".format(scheme, args.host, args.port),
        file=sys.stderr,
    )

    from wsgiref.simple_server import make_server

    make_server(args.host, args.port, app).serve_forever()
    return 0