9 |
9 |
10 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer |
10 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer |
11 import mimetypes |
11 import mimetypes |
12 import os |
12 import os |
13 import re |
13 import re |
|
14 import stat |
14 import sys |
15 import sys |
15 import urllib |
16 import urllib |
16 |
17 |
17 from django.utils.http import http_date |
18 from django.utils.http import http_date |
18 |
19 |
19 __version__ = "0.1" |
20 __version__ = "0.1" |
20 __all__ = ['WSGIServer','WSGIRequestHandler','demo_app'] |
21 __all__ = ['WSGIServer','WSGIRequestHandler'] |
21 |
22 |
22 server_version = "WSGIServer/" + __version__ |
23 server_version = "WSGIServer/" + __version__ |
23 sys_version = "Python/" + sys.version.split()[0] |
24 sys_version = "Python/" + sys.version.split()[0] |
24 software_version = server_version + ' ' + sys_version |
25 software_version = server_version + ' ' + sys_version |
25 |
26 |
549 server_version = "WSGIServer/" + __version__ |
550 server_version = "WSGIServer/" + __version__ |
550 |
551 |
551 def __init__(self, *args, **kwargs): |
552 def __init__(self, *args, **kwargs): |
552 from django.conf import settings |
553 from django.conf import settings |
553 self.admin_media_prefix = settings.ADMIN_MEDIA_PREFIX |
554 self.admin_media_prefix = settings.ADMIN_MEDIA_PREFIX |
|
555 # We set self.path to avoid crashes in log_message() on unsupported |
|
556 # requests (like "OPTIONS"). |
|
557 self.path = '' |
554 BaseHTTPRequestHandler.__init__(self, *args, **kwargs) |
558 BaseHTTPRequestHandler.__init__(self, *args, **kwargs) |
555 |
559 |
556 def get_environ(self): |
560 def get_environ(self): |
557 env = self.server.base_environ.copy() |
561 env = self.server.base_environ.copy() |
558 env['SERVER_PROTOCOL'] = self.request_version |
562 env['SERVER_PROTOCOL'] = self.request_version |
643 except IOError: |
647 except IOError: |
644 status = '401 UNAUTHORIZED' |
648 status = '401 UNAUTHORIZED' |
645 headers = {'Content-type': 'text/plain'} |
649 headers = {'Content-type': 'text/plain'} |
646 output = ['Permission denied: %s' % file_path] |
650 output = ['Permission denied: %s' % file_path] |
647 else: |
651 else: |
648 status = '200 OK' |
652 # This is a very simple implementation of conditional GET with |
649 headers = {} |
653 # the Last-Modified header. It makes media files a bit speedier |
650 mime_type = mimetypes.guess_type(file_path)[0] |
654 # because the files are only read off disk for the first |
651 if mime_type: |
655 # request (assuming the browser/client supports conditional |
652 headers['Content-Type'] = mime_type |
656 # GET). |
653 output = [fp.read()] |
657 mtime = http_date(os.stat(file_path)[stat.ST_MTIME]) |
654 fp.close() |
658 headers = {'Last-Modified': mtime} |
|
659 if environ.get('HTTP_IF_MODIFIED_SINCE', None) == mtime: |
|
660 status = '304 NOT MODIFIED' |
|
661 output = [] |
|
662 else: |
|
663 status = '200 OK' |
|
664 mime_type = mimetypes.guess_type(file_path)[0] |
|
665 if mime_type: |
|
666 headers['Content-Type'] = mime_type |
|
667 output = [fp.read()] |
|
668 fp.close() |
655 start_response(status, headers.items()) |
669 start_response(status, headers.items()) |
656 return output |
670 return output |
657 |
671 |
658 def run(addr, port, wsgi_handler): |
672 def run(addr, port, wsgi_handler): |
659 server_address = (addr, port) |
673 server_address = (addr, port) |