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