Edgewall Software

Ticket #8020: tracd-http11-r8080.diff

File tracd-http11-r8080.diff, 5.0 KB (added by cboos, 3 years ago)

Improved support for HTTP/1.1 in tracd - still not 100% but complete enough for checking this issue

  • trac/mimeview/api.py

     
    914914                                                         content, selector) 
    915915        req.send_response(200) 
    916916        req.send_header('Content-Type', output_type) 
     917        req.send_header('Content-Length', len(content)) 
    917918        if filename: 
    918919            req.send_header('Content-Disposition', 'filename=%s.%s' %  
    919920                        (filename, ext)) 
  • trac/web/standalone.py

     
    102102 
    103103class TracHTTPServer(ThreadingMixIn, WSGIServer): 
    104104 
    105     def __init__(self, server_address, application, env_parent_dir, env_paths): 
     105    def __init__(self, server_address, application, env_parent_dir, env_paths, 
     106                 use_http_11=False): 
     107        request_handlers = (TracHTTPRequestHandler, TracHTTP11RequestHandler) 
    106108        WSGIServer.__init__(self, server_address, application, 
    107                             request_handler=TracHTTPRequestHandler) 
     109                            request_handler=request_handlers[bool(use_http_11)]) 
    108110 
    109111 
    110112class TracHTTPRequestHandler(WSGIRequestHandler): 
     
    115117        # Disable reverse name lookups 
    116118        return self.client_address[:2][0] 
    117119 
     120class TracHTTP11RequestHandler(TracHTTPRequestHandler): 
     121    protocol_version = 'HTTP/1.1' 
    118122 
     123 
    119124def main(): 
    120125    from optparse import OptionParser, OptionValueError 
    121126    parser = OptionParser(usage='usage: %prog [options] [projenv] ...', 
     
    161166    parser.add_option('-q', '--unquote', action='store_true', 
    162167                      dest='unquote', 
    163168                      help='unquote PATH_INFO (may be needed when using ajp') 
     169    parser.add_option('--http11', action='store_true', dest='http11', 
     170                      help='use HTTP/1.1 protocol version instead of HTTP/1.0') 
    164171    parser.add_option('-e', '--env-parent-dir', action='store', 
    165172                      dest='env_parent_dir', metavar='PARENTDIR', 
    166173                      help='parent directory of the project environments') 
     
    237244    if options.protocol == 'http': 
    238245        def serve(): 
    239246            httpd = TracHTTPServer(server_address, wsgi_app, 
    240                                    options.env_parent_dir, args) 
     247                                   options.env_parent_dir, args, 
     248                                   use_http_11=options.http11) 
     249 
    241250            print 'Server starting in PID %i.' % os.getpid() 
    242251            addr, port = server_address 
    243252            if not addr or addr == '0.0.0.0': 
     
    245254                       % (port, port, base_path) 
    246255            else: 
    247256                print 'Serving on http://%s:%s/%s' % (addr, port, base_path) 
     257            if options.http11: 
     258                print 'Using HTTP/1.1 protocol version' 
    248259            httpd.serve_forever() 
    249260    elif options.protocol in ('scgi', 'ajp'): 
    250261        def serve(): 
  • trac/web/auth.py

     
    295295                    return user 
    296296 
    297297        start_response('401 Unauthorized', 
    298                        [('WWW-Authenticate', 'Basic realm="%s"' 
    299                          % self.realm)])('') 
     298                       [('WWW-Authenticate', 'Basic realm="%s"' % self.realm), 
     299                        ('Content-Length', 0)])('') 
    300300 
    301301 
    302302class DigestAuthentication(PasswordFileAuthentication): 
     
    351351        start_response('401 Unauthorized', 
    352352                       [('WWW-Authenticate', 
    353353                        'Digest realm="%s", nonce="%s", qop="auth", stale="%s"' 
    354                         % (self.realm, nonce, stale))])('') 
     354                        % (self.realm, nonce, stale)), 
     355                        ('Content-Length', 0)])('') 
    355356 
    356357    def do_auth(self, environ, start_response): 
    357358        header = environ.get('HTTP_AUTHORIZATION') 
  • trac/web/api.py

     
    308308 
    309309        self.send_header('Location', url) 
    310310        self.send_header('Content-Type', 'text/plain') 
     311        self.send_header('Content-Length', 0) 
    311312        self.send_header('Pragma', 'no-cache') 
    312313        self.send_header('Cache-control', 'no-cache') 
    313314        self.send_header('Expires', 'Fri, 01 Jan 1999 00:00:00 GMT') 
    314315        self.end_headers() 
    315316 
    316         if self.method != 'HEAD': 
    317             self.write('Redirecting...') 
    318317        raise RequestDone 
    319318 
    320319    def display(self, template, content_type='text/html', status=200): 
     
    406405        last_modified = http_date(mtime) 
    407406        if last_modified == self.get_header('If-Modified-Since'): 
    408407            self.send_response(304) 
     408            self.send_header('Content-Length', 0) 
    409409            self.end_headers() 
    410410            raise RequestDone 
    411411