Mercurial > bzapi
annotate bzapi_server.py @ 35:45d84e588d14
massive refactorings to bzapi_server.py
author | Atul Varma <varmaa@toolness.com> |
---|---|
date | Thu, 24 Dec 2009 17:53:19 -0800 |
parents | b4fab248d1eb |
children | 352f4cc55d12 |
rev | line source |
---|---|
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
1 import os |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
2 import sys |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
3 import math |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
4 import re |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
5 import httplib |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
6 import cStringIO |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
7 import mimetools |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
8 import mimetypes |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
9 import weakref |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
10 import cgi |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
11 import logging |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
12 |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
13 from cosocket import * |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
14 import channels |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
15 |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
16 try: |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
17 import json |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
18 except ImportError: |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
19 import simplejson as json |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
20 |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
21 KEEP_ALIVE_MAX_REQUESTS = 99 |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
22 KEEP_ALIVE_TIMEOUT = int(DEFAULT_TIMEOUT) |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
23 KEEP_ALIVE_ENABLED = True |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
24 |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
25 BLOCK_SIZE = 8192 |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
26 |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
27 def until_http_response_sent(msg = '', mimetype = 'text/plain', |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
28 length = None, code = 200, |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
29 additional_headers = None): |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
30 headers = {'Content-Type': mimetype} |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
31 if KEEP_ALIVE_ENABLED: |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
32 headers.update({'Keep-Alive': 'timeout=%d, max=%d' % |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
33 (KEEP_ALIVE_TIMEOUT, |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
34 KEEP_ALIVE_MAX_REQUESTS), |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
35 'Connection': 'Keep-Alive'}) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
36 if additional_headers: |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
37 headers.update(additional_headers) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
38 if length is None: |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
39 length = len(msg) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
40 headers['Content-Length'] = str(length) |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
41 |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
42 header_lines = ['HTTP/1.1 %d %s' % (code, |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
43 httplib.responses[code])] |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
44 header_lines.extend(['%s: %s' % (key, value) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
45 for key, value in headers.items()]) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
46 header_lines.extend(['', msg]) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
47 content = '\r\n'.join(header_lines) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
48 yield until_sent(content) |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
49 |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
50 def until_http_file_sent(filename, block_size = BLOCK_SIZE): |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
51 ext = '.' + filename.split('.')[-1] |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
52 |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
53 if ext in mimetypes.types_map: |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
54 mimetype = mimetypes.types_map[ext] |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
55 else: |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
56 mimetype = 'text/plain' |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
57 |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
58 length = os.stat(filename).st_size |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
59 num_blocks = length / block_size |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
60 if length % block_size: |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
61 num_blocks += 1 |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
62 infile = open(filename, 'r') |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
63 |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
64 yield until_http_response_sent(mimetype = mimetype, |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
65 length = length) |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
66 |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
67 for i in range(num_blocks): |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
68 # TODO: This could be bad since we're reading the file |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
69 # synchronously. |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
70 block = infile.read(block_size) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
71 yield until_sent(block) |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
72 |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
73 class AsyncWebServer(object): |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
74 def __init__(self, addr, app): |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
75 self._num_connections = 0 |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
76 self._app = app |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
77 AsyncChatCoroutine(self._server_coroutine(addr)) |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
78 |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
79 def _server_coroutine(self, bind_addr): |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
80 yield until_listening(bind_addr) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
81 while 1: |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
82 conn, addr = yield until_connection_accepted() |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
83 AsyncChatCoroutine(self._connection_coroutine(addr), conn) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
84 |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
85 def _connection_coroutine(self, addr): |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
86 self._num_connections += 1 |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
87 try: |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
88 if KEEP_ALIVE_ENABLED: |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
89 for i in range(KEEP_ALIVE_MAX_REQUESTS): |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
90 yield self._until_one_request_processed(addr) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
91 else: |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
92 yield self._until_one_request_processed(addr) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
93 finally: |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
94 logging.info('Closing connection to %s' % repr(addr)) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
95 self._num_connections -= 1 |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
96 |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
97 def _until_one_request_processed(self, addr): |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
98 request = yield until_received(terminator = '\r\n\r\n') |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
99 request = request.splitlines() |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
100 request_line = request[0] |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
101 logging.info("Request from %s: %s" % (addr, request_line)) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
102 stringfile = cStringIO.StringIO('\n'.join(request[1:])) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
103 headers = mimetools.Message(stringfile) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
104 req_parts = request_line.split() |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
105 |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
106 yield self._app.until_request_processed(method = req_parts[0], |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
107 path = req_parts[1], |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
108 headers = headers, |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
109 addr = addr) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
110 |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
111 class BugzillaApiApp(object): |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
112 QUERYSTRING_TEMPLATE = re.compile('([^\?]*)\?(.*)') |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
113 REDIRECT_TEMPLATE = re.compile('\/([A-Za-z0-9_]+)$') |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
114 URL_TEMPLATE = re.compile('\/([A-Za-z0-9_]+)/(.*)') |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
115 MAX_MESSAGE_SIZE = 8192 |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
116 ROBOTS_TXT = "User-agent: *\r\nDisallow: /" |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
117 |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
118 def __init__(self, media_dir, index_filename): |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
119 self._media_dir = media_dir |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
120 self._index_filename = index_filename |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
121 |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
122 def until_request_processed(self, method, path, headers, addr): |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
123 match = self.URL_TEMPLATE.match(path) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
124 |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
125 if path == '/': |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
126 yield until_http_file_sent(self._index_filename) |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
127 elif not match: |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
128 match = self.REDIRECT_TEMPLATE.match(path) |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
129 if match: |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
130 newpath = path + '/' |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
131 yield until_http_response_sent( |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
132 newpath, |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
133 code = 301, |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
134 additional_headers = {'Location': newpath} |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
135 ) |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
136 elif path == '/robots.txt': |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
137 yield until_http_response_sent(self.ROBOTS_TXT) |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
138 else: |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
139 yield until_http_response_sent('not found', |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
140 code = 404) |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
141 else: |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
142 conv_name = match.group(1) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
143 page = match.group(2) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
144 if conv_name == 'status': |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
145 # TODO: Return 404 if page is non-empty. |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
146 lines = ('open connections : %d' % self._num_connections, |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
147 'open timers : %d' % len(time_map)) |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
148 yield until_http_response_sent('\r\n'.join(lines)) |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
149 elif conv_name == 'media': |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
150 path = os.path.join(self._media_dir, *page.split('/')) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
151 path = os.path.normpath(path) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
152 if (path.startswith(self._media_dir) and |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
153 os.path.exists(path) and |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
154 os.path.isfile(path)): |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
155 yield until_http_file_sent(path) |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
156 else: |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
157 yield until_http_response_sent('not found', |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
158 code = 404) |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
159 else: |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
160 yield self._until_conv_request_processed(addr, headers, |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
161 method, conv_name, |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
162 page) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
163 |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
164 def _parse_qs(self, querystring): |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
165 querydict = {} |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
166 cgi_querydict = cgi.parse_qs(querystring) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
167 for key, value in cgi_querydict.items(): |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
168 querydict[key] = cgi_querydict[key][0] |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
169 return querydict |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
170 |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
171 def _until_conv_request_processed(self, addr, headers, method, |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
172 conv_name, page): |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
173 match = self.QUERYSTRING_TEMPLATE.match(page) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
174 querydict = {} |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
175 if match: |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
176 querydict.update(self._parse_qs(match.group(2))) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
177 page = match.group(1) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
178 if page == 'listen': |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
179 logging.info("Waiting for message on channel '%s' for %s" % |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
180 (conv_name, addr)) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
181 msg = yield channels.until_message_received(conv_name) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
182 yield until_http_response_sent( |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
183 json.dumps(msg), |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
184 mimetype = 'application/json' |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
185 ) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
186 elif page == 'send': |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
187 length = int(headers.getheader('Content-Length', 0)) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
188 if length == 0 or length > self.MAX_MESSAGE_SIZE: |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
189 yield until_http_response_sent('message too large', |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
190 code = 413) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
191 else: |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
192 msg = yield until_received(bytes = length) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
193 json_msg = json.loads(msg) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
194 yield channels.until_message_sent(conv_name, json_msg) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
195 yield until_http_response_sent('sent.') |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
196 else: |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
197 yield until_http_response_sent('not found', code = 404) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
198 |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
199 if __name__ == '__main__': |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
200 args = dict(ip = '127.0.0.1', |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
201 port = 8071, |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
202 logfile = '', |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
203 loglevel = 'info', |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
204 media_dir = os.path.abspath('media')) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
205 |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
206 args['index_filename'] = os.path.join(args['media_dir'], 'html', |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
207 'index.html') |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
208 args['loglevel'] = getattr(logging, args['loglevel'].upper()) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
209 if args['logfile']: |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
210 logging.basicConfig(filename = args['logfile'], |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
211 level = args['loglevel']) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
212 else: |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
213 logging.basicConfig(stream = sys.stdout, |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
214 level = args['loglevel']) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
215 |
35
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
216 app = BugzillaApiApp(media_dir = args['media_dir'], |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
217 index_filename = args['index_filename']) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
218 |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
219 server = AsyncWebServer(addr = (args['ip'], args['port']), |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
220 app = app) |
45d84e588d14
massive refactorings to bzapi_server.py
Atul Varma <varmaa@toolness.com>
parents:
34
diff
changeset
|
221 |
34
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
222 logging.info("Starting server with configuration: %s" % args) |
b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
223 loop() |