annotate bzapi_server.py @ 34:b4fab248d1eb

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