Mercurial > wiki
annotate atulweb.py @ 28:602baadb535a default tip
Added a requesthandler infrastructure to atulweb.
author | Atul Varma <varmaa@toolness.com> |
---|---|
date | Wed, 11 Mar 2009 23:19:18 -0500 |
parents | 1850638c1da5 |
children |
rev | line source |
---|---|
21
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
1 import StringIO |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
2 import httplib |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
3 import cgi |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
4 import traceback |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
5 import sys |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
6 import re |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
7 import os |
28
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
8 import types |
21
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
9 import mimetypes |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
10 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
11 try: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
12 import json |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
13 except ImportError: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
14 import simplejson as json |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
15 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
16 DEFAULT_LISTEN_PORT = 8000 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
17 |
28
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
18 OPEN_STR = "{" |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
19 CLOSE_STR = "}" |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
20 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
21 def _parse_request_path_pattern(pattern, current=None): |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
22 """ |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
23 >>> _parse_request_path_pattern('/blarg/{foob}/narb') |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
24 [('s', '/blarg/'), ('n', 'foob'), ('s', '/narb')] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
25 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
26 >>> _parse_request_path_pattern('{foob}/gump') |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
27 [('n', 'foob'), ('s', '/gump')] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
28 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
29 >>> _parse_request_path_pattern('{foob}') |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
30 [('n', 'foob')] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
31 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
32 >>> _parse_request_path_pattern('gump') |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
33 [('s', 'gump')] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
34 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
35 >>> _parse_request_path_pattern('{}') |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
36 Traceback (most recent call last): |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
37 ... |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
38 ValueError: empty noun |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
39 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
40 >>> _parse_request_path_pattern('/goop/{regr') |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
41 Traceback (most recent call last): |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
42 ... |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
43 ValueError: unclosed noun |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
44 """ |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
45 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
46 if current is None: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
47 current = [] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
48 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
49 open_index = pattern.find(OPEN_STR) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
50 if open_index != -1: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
51 string_part = pattern[:open_index] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
52 rest = pattern[open_index+len(OPEN_STR):] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
53 close_index = rest.find(CLOSE_STR) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
54 if close_index == -1: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
55 raise ValueError("unclosed noun") |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
56 noun_part = rest[:close_index] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
57 rest = rest[close_index+len(CLOSE_STR):] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
58 if string_part: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
59 current.append(('s', string_part)) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
60 if noun_part: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
61 current.append(('n', noun_part)) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
62 _parse_request_path_pattern(rest, current) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
63 else: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
64 raise ValueError("empty noun") |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
65 elif pattern: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
66 current.append(('s', pattern)) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
67 return current |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
68 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
69 def make_request_map(requests): |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
70 """ |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
71 >>> requests = {'blarg': 'GET /blar/{goop}', |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
72 ... 'fnarg': 'POST /blarg/goopy'} |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
73 >>> req_map = make_request_map(requests) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
74 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
75 >>> req_map['GET']['blarg'] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
76 [('s', '/blar/'), ('n', 'goop')] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
77 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
78 >>> req_map['POST']['fnarg'] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
79 [('s', '/blarg/goopy')] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
80 """ |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
81 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
82 request_map = {} |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
83 for key in requests: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
84 method, pattern = requests[key].split(' ') |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
85 if method not in request_map: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
86 request_map[method] = {} |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
87 request_map[method][key] = _parse_request_path_pattern(pattern) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
88 return request_map |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
89 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
90 def _match_request_path(path_pattern, path, nouns): |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
91 """ |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
92 >>> import re |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
93 >>> pattern = [('s', '/bla/'), ('n', 'doc')] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
94 >>> nouns = {'doc': re.compile(r'[0-9]+')} |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
95 >>> _match_request_path(pattern, '/bla/4532', nouns) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
96 {'doc': '4532'} |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
97 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
98 >>> _match_request_path(pattern, '/bla/garg/4532/', nouns) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
99 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
100 >>> _match_request_path(pattern, '/bla/garg/4532', nouns) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
101 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
102 >>> _match_request_path(pattern, '/4532', {'doc': r'.*'}) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
103 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
104 >>> _match_request_path([('s', '/status')], '/status', {}) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
105 {} |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
106 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
107 >>> _match_request_path([('n', 'doc')], '345', nouns) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
108 {'doc': '345'} |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
109 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
110 >>> _match_request_path([('n', 'doc'), ('s', '/go')], '345/go', nouns) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
111 {'doc': '345'} |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
112 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
113 >>> _match_request_path([('n', 'doc'), ('s', '/go')], '345', nouns) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
114 """ |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
115 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
116 matches = {} |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
117 curr_noun = None |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
118 path_pattern = list(path_pattern) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
119 path_pattern.append(('end', None)) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
120 for seg_type, seg_value in path_pattern: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
121 noun_to_check = None |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
122 if seg_type == 'n': |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
123 curr_noun = seg_value |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
124 elif seg_type == 's': |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
125 index = path.find(seg_value) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
126 if (index == -1): |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
127 return None |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
128 elif index == 0: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
129 if curr_noun: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
130 return None |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
131 else: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
132 path = path[len(seg_value):] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
133 else: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
134 if curr_noun: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
135 noun_to_check = path[:index] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
136 path = path[index:] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
137 else: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
138 return None |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
139 elif seg_type == 'end': |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
140 if curr_noun is not None: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
141 noun_to_check = path |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
142 else: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
143 raise ValueError('unknown segment type in path pattern') |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
144 if noun_to_check is not None: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
145 if nouns[curr_noun].match(noun_to_check): |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
146 matches[curr_noun] = noun_to_check |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
147 curr_noun = None |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
148 else: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
149 return None |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
150 return matches |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
151 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
152 def map_request(environ, request_map, nouns, mapping_obj): |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
153 method = environ['REQUEST_METHOD'] |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
154 if method in request_map: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
155 for name in request_map[method]: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
156 match = _match_request_path(request_map[method][name], |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
157 environ['PATH_INFO'], |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
158 nouns) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
159 if match is not None: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
160 return getattr(mapping_obj, name)(**match) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
161 raise HttpError('not found') |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
162 else: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
163 raise HttpError('method not allowed') |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
164 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
165 def make_wsgiapp(request_handler): |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
166 requests = {} |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
167 for name in dir(request_handler): |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
168 method = getattr(request_handler, name) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
169 if type(method) == types.MethodType: |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
170 requests[name] = method.__doc__.strip() |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
171 request_map = make_request_map(requests) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
172 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
173 @wsgiapp |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
174 def application(environ, start_response): |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
175 request_handler.environ = environ |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
176 return map_request(environ, |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
177 request_map, |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
178 request_handler.NOUNS, |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
179 request_handler) |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
180 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
181 return application |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
182 |
21
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
183 class HttpError(Exception): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
184 def __init__(self, status, body=None, headers=None): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
185 if isinstance(status, basestring): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
186 if not status[0].isdigit(): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
187 status = status_codes[status.lower()] |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
188 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
189 if isinstance(status, int): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
190 status = '%d %s' % (status, responses[status]) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
191 else: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
192 raise ValueError("bad status '%s'" % status) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
193 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
194 if not body: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
195 body = status |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
196 if not headers: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
197 headers = [('Content-Type','text/plain')] |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
198 self.status = status |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
199 self.body = body |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
200 self.headers = headers |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
201 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
202 class Response(object): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
203 def __init__(self, body, mimetype='text/plain', headers=None): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
204 if isinstance(body, basestring): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
205 self.body = body |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
206 elif mimetype == 'application/json': |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
207 self.body = json.dumps(body) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
208 else: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
209 raise ValueError('Cannot process body: %s' % body) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
210 self.status = '200 OK' |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
211 self.headers = [('Content-Type', mimetype), |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
212 ('Content-Length', str(len(self.body)))] |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
213 if headers: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
214 self.headers += headers |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
215 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
216 class Request(object): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
217 def __init__(self, environ): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
218 self._environ = environ |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
219 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
220 def get_input(self, mimetype='text/plain'): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
221 length = int(self._environ['CONTENT_LENGTH']) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
222 content = self._environ['wsgi.input'].read(length) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
223 if mimetype == 'application/json': |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
224 content = json.loads(content) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
225 return content |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
226 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
227 def parse_qs(querystring): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
228 querydict = {} |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
229 cgi_querydict = cgi.parse_qs(querystring) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
230 for key, value in cgi_querydict.items(): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
231 querydict[key] = cgi_querydict[key][0] |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
232 return querydict |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
233 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
234 def wsgiapp(application): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
235 def wrapped_application(environ, start_response, *args, **kwargs): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
236 def make_response(response): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
237 start_response(response.status, response.headers) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
238 return [response.body] |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
239 environ['atulweb.request'] = Request(environ) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
240 try: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
241 retval = application(environ, start_response, *args, **kwargs) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
242 except HttpError, e: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
243 return make_response(e) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
244 except Exception, e: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
245 tb = traceback.format_exc() |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
246 sys.stderr.write(tb) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
247 return make_response(HttpError('internal server error', tb)) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
248 if isinstance(retval, Response): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
249 return make_response(retval) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
250 return retval |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
251 for attr in ['__doc__', '__name__', '__module__']: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
252 setattr(wrapped_application, attr, getattr(application, attr)) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
253 return wrapped_application |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
254 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
255 def main(application): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
256 if len(sys.argv) == 2 and sys.argv[1] == 'test': |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
257 import doctest |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
258 module = __import__('__main__') |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
259 doctest.testmod(module, verbose=True) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
260 else: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
261 from wsgiref.simple_server import make_server |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
262 port = DEFAULT_LISTEN_PORT |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
263 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
264 @wsgiapp |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
265 def parent_application(environ, start_response): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
266 match = re.match(r'\/static-files(\/.*)', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
267 environ['PATH_INFO']) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
268 if match: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
269 environ['PATH_INFO'] = match.group(1) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
270 return static_file_wsgi_app(environ, start_response, |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
271 base_dir='static-files') |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
272 else: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
273 return application(environ, start_response) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
274 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
275 httpd = make_server('127.0.0.1', port, parent_application) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
276 print 'Listening on localhost port %d.' % port |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
277 print "(Run '%s test' to execute test suite.)" % sys.argv[0] |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
278 # Respond to requests until process is killed |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
279 httpd.serve_forever() |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
280 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
281 @wsgiapp |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
282 def static_file_wsgi_app(environ, start_response, base_dir): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
283 path = environ['PATH_INFO'][1:] |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
284 filename = os.path.join(base_dir, path) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
285 if os.path.exists(filename): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
286 if os.path.isdir(filename): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
287 return Response('\n'.join(os.listdir(filename)), |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
288 mimetype = 'text/plain') |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
289 else: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
290 return Response(open(filename, 'r').read(), |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
291 mimetype = mimetypes.guess_type(filename)[0]) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
292 else: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
293 raise HttpError('not found') |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
294 |
28
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
295 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
296 |
21
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
297 def test_request(application, requestline='', input='', **kwargs): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
298 environ = {} |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
299 words = requestline.split() |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
300 if words: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
301 environ['REQUEST_METHOD'] = words[0] |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
302 if len(words) > 1: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
303 environ['PATH_INFO'] = words[1] |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
304 environ['wsgi.input'] = StringIO.StringIO(input) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
305 environ['CONTENT_LENGTH'] = str(len(input)) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
306 environ.update(kwargs) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
307 def mock_start_response(status, headers): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
308 print "HTTP/1.1 %s" % status |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
309 for name, value in headers: |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
310 print "%s: %s" % (name, value) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
311 result = application(environ, mock_start_response) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
312 print '.' |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
313 print ''.join(result) |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
314 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
315 # Mapping status codes to official W3C names. This is included in the httplib |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
316 # module in Python 2.5, but we want this module to work in 2.4. |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
317 responses = { |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
318 100: 'Continue', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
319 101: 'Switching Protocols', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
320 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
321 200: 'OK', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
322 201: 'Created', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
323 202: 'Accepted', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
324 203: 'Non-Authoritative Information', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
325 204: 'No Content', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
326 205: 'Reset Content', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
327 206: 'Partial Content', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
328 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
329 300: 'Multiple Choices', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
330 301: 'Moved Permanently', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
331 302: 'Found', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
332 303: 'See Other', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
333 304: 'Not Modified', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
334 305: 'Use Proxy', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
335 306: '(Unused)', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
336 307: 'Temporary Redirect', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
337 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
338 400: 'Bad Request', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
339 401: 'Unauthorized', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
340 402: 'Payment Required', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
341 403: 'Forbidden', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
342 404: 'Not Found', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
343 405: 'Method Not Allowed', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
344 406: 'Not Acceptable', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
345 407: 'Proxy Authentication Required', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
346 408: 'Request Timeout', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
347 409: 'Conflict', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
348 410: 'Gone', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
349 411: 'Length Required', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
350 412: 'Precondition Failed', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
351 413: 'Request Entity Too Large', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
352 414: 'Request-URI Too Long', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
353 415: 'Unsupported Media Type', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
354 416: 'Requested Range Not Satisfiable', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
355 417: 'Expectation Failed', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
356 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
357 500: 'Internal Server Error', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
358 501: 'Not Implemented', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
359 502: 'Bad Gateway', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
360 503: 'Service Unavailable', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
361 504: 'Gateway Timeout', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
362 505: 'HTTP Version Not Supported', |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
363 } |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
364 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
365 status_codes = {} |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
366 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
367 def __init(): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
368 for key, value in responses.items(): |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
369 status_codes[value.lower()] = key |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
370 |
1850638c1da5
Added simple python WSGI server.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
371 __init() |
28
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
372 |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
373 if __name__ == '__main__': |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
374 import doctest |
602baadb535a
Added a requesthandler infrastructure to atulweb.
Atul Varma <varmaa@toolness.com>
parents:
21
diff
changeset
|
375 doctest.testmod(verbose=True) |