Mercurial > bzapi
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 |
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() |