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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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()