Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Side by Side Diff: net/tools/testserver/testserver.py

Issue 17009: Fix the test server to be smarter about when to... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python2.4 1 #!/usr/bin/python2.4
2 # Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """This is a simple HTTP server used for testing Chrome. 6 """This is a simple HTTP server used for testing Chrome.
7 7
8 It supports several test URLs, as specified by the handlers in TestPageHandler. 8 It supports several test URLs, as specified by the handlers in TestPageHandler.
9 It defaults to living on localhost:8888. 9 It defaults to living on localhost:8888.
10 It can use https if you specify the flag --https=CERT where CERT is the path 10 It can use https if you specify the flag --https=CERT where CERT is the path
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 self._post_handlers = [ 102 self._post_handlers = [
103 self.EchoTitleHandler, 103 self.EchoTitleHandler,
104 self.EchoAllHandler, 104 self.EchoAllHandler,
105 self.EchoHandler] + self._get_handlers 105 self.EchoHandler] + self._get_handlers
106 106
107 self._mime_types = { 'gif': 'image/gif', 'jpeg' : 'image/jpeg', 'jpg' : 'im age/jpeg' } 107 self._mime_types = { 'gif': 'image/gif', 'jpeg' : 'image/jpeg', 'jpg' : 'im age/jpeg' }
108 self._default_mime_type = 'text/html' 108 self._default_mime_type = 'text/html'
109 109
110 BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address , socket_server) 110 BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address , socket_server)
111 111
112 def _ShouldHandleRequest(self, handler_name):
113 """Determines if the path can be handled by the handler.
114
115 We consider a handler valid if the path begins with the
116 handler name. It can optionally be followed by "?*", "/*".
117 """
118
119 pattern = re.compile('%s($|\?|/).*' % handler_name)
120 return pattern.match(self.path)
121
112 def GetMIMETypeFromName(self, file_name): 122 def GetMIMETypeFromName(self, file_name):
113 """Returns the mime type for the specified file_name. So far it only looks 123 """Returns the mime type for the specified file_name. So far it only looks
114 at the file extension.""" 124 at the file extension."""
115 125
116 (shortname, extension) = os.path.splitext(file_name) 126 (shortname, extension) = os.path.splitext(file_name)
117 if len(extension) == 0: 127 if len(extension) == 0:
118 # no extension. 128 # no extension.
119 return self._default_mime_type 129 return self._default_mime_type
120 130
121 return self._mime_types.get(extension, self._default_mime_type) 131 return self._mime_types.get(extension, self._default_mime_type)
(...skipping 11 matching lines...) Expand all
133 self.end_headers() 143 self.end_headers()
134 self.wfile.write("Time to die") 144 self.wfile.write("Time to die")
135 self.server.stop = True 145 self.server.stop = True
136 146
137 return True 147 return True
138 148
139 def NoCacheMaxAgeTimeHandler(self): 149 def NoCacheMaxAgeTimeHandler(self):
140 """This request handler yields a page with the title set to the current 150 """This request handler yields a page with the title set to the current
141 system time, and no caching requested.""" 151 system time, and no caching requested."""
142 152
143 if (self.path.find("/nocachetime/maxage") != 0): 153 if not self._ShouldHandleRequest("/nocachetime/maxage"):
144 return False 154 return False
145 155
146 self.send_response(200) 156 self.send_response(200)
147 self.send_header('Cache-Control', 'max-age=0') 157 self.send_header('Cache-Control', 'max-age=0')
148 self.send_header('Content-type', 'text/html') 158 self.send_header('Content-type', 'text/html')
149 self.end_headers() 159 self.end_headers()
150 160
151 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() ) 161 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() )
152 162
153 return True 163 return True
154 164
155 def NoCacheTimeHandler(self): 165 def NoCacheTimeHandler(self):
156 """This request handler yields a page with the title set to the current 166 """This request handler yields a page with the title set to the current
157 system time, and no caching requested.""" 167 system time, and no caching requested."""
158 168
159 if (self.path.find("/nocachetime") != 0): 169 if not self._ShouldHandleRequest("/nocachetime"):
160 return False 170 return False
161 171
162 self.send_response(200) 172 self.send_response(200)
163 self.send_header('Cache-Control', 'no-cache') 173 self.send_header('Cache-Control', 'no-cache')
164 self.send_header('Content-type', 'text/html') 174 self.send_header('Content-type', 'text/html')
165 self.end_headers() 175 self.end_headers()
166 176
167 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() ) 177 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() )
168 178
169 return True 179 return True
170 180
171 def CacheTimeHandler(self): 181 def CacheTimeHandler(self):
172 """This request handler yields a page with the title set to the current 182 """This request handler yields a page with the title set to the current
173 system time, and allows caching for one minute.""" 183 system time, and allows caching for one minute."""
174 184
175 if self.path.find("/cachetime") != 0: 185 if not self._ShouldHandleRequest("/cachetime"):
176 return False 186 return False
177 187
178 self.send_response(200) 188 self.send_response(200)
179 self.send_header('Cache-Control', 'max-age=60') 189 self.send_header('Cache-Control', 'max-age=60')
180 self.send_header('Content-type', 'text/html') 190 self.send_header('Content-type', 'text/html')
181 self.end_headers() 191 self.end_headers()
182 192
183 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() ) 193 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() )
184 194
185 return True 195 return True
186 196
187 def CacheExpiresHandler(self): 197 def CacheExpiresHandler(self):
188 """This request handler yields a page with the title set to the current 198 """This request handler yields a page with the title set to the current
189 system time, and set the page to expire on 1 Jan 2099.""" 199 system time, and set the page to expire on 1 Jan 2099."""
190 200
191 if (self.path.find("/cache/expires") != 0): 201 if not self._ShouldHandleRequest("/cache/expires"):
192 return False 202 return False
193 203
194 self.send_response(200) 204 self.send_response(200)
195 self.send_header('Expires', 'Thu, 1 Jan 2099 00:00:00 GMT') 205 self.send_header('Expires', 'Thu, 1 Jan 2099 00:00:00 GMT')
196 self.send_header('Content-type', 'text/html') 206 self.send_header('Content-type', 'text/html')
197 self.end_headers() 207 self.end_headers()
198 208
199 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() ) 209 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() )
200 210
201 return True 211 return True
202 212
203 def CacheProxyRevalidateHandler(self): 213 def CacheProxyRevalidateHandler(self):
204 """This request handler yields a page with the title set to the current 214 """This request handler yields a page with the title set to the current
205 system time, and allows caching for 60 seconds""" 215 system time, and allows caching for 60 seconds"""
206 216
207 if (self.path.find("/cache/proxy-revalidate") != 0): 217 if not self._ShouldHandleRequest("/cache/proxy-revalidate"):
208 return False 218 return False
209 219
210 self.send_response(200) 220 self.send_response(200)
211 self.send_header('Content-type', 'text/html') 221 self.send_header('Content-type', 'text/html')
212 self.send_header('Cache-Control', 'max-age=60, proxy-revalidate') 222 self.send_header('Cache-Control', 'max-age=60, proxy-revalidate')
213 self.end_headers() 223 self.end_headers()
214 224
215 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() ) 225 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() )
216 226
217 return True 227 return True
218 228
219 def CachePrivateHandler(self): 229 def CachePrivateHandler(self):
220 """This request handler yields a page with the title set to the current 230 """This request handler yields a page with the title set to the current
221 system time, and allows caching for 5 seconds.""" 231 system time, and allows caching for 5 seconds."""
222 232
223 if (self.path.find("/cache/private") != 0): 233 if not self._ShouldHandleRequest("/cache/private"):
224 return False 234 return False
225 235
226 self.send_response(200) 236 self.send_response(200)
227 self.send_header('Content-type', 'text/html') 237 self.send_header('Content-type', 'text/html')
228 self.send_header('Cache-Control', 'max-age=5, private') 238 self.send_header('Cache-Control', 'max-age=5, private')
229 self.end_headers() 239 self.end_headers()
230 240
231 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() ) 241 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() )
232 242
233 return True 243 return True
234 244
235 def CachePublicHandler(self): 245 def CachePublicHandler(self):
236 """This request handler yields a page with the title set to the current 246 """This request handler yields a page with the title set to the current
237 system time, and allows caching for 5 seconds.""" 247 system time, and allows caching for 5 seconds."""
238 248
239 if (self.path.find("/cache/public") != 0): 249 if not self._ShouldHandleRequest("/cache/public"):
240 return False 250 return False
241 251
242 self.send_response(200) 252 self.send_response(200)
243 self.send_header('Content-type', 'text/html') 253 self.send_header('Content-type', 'text/html')
244 self.send_header('Cache-Control', 'max-age=5, public') 254 self.send_header('Cache-Control', 'max-age=5, public')
245 self.end_headers() 255 self.end_headers()
246 256
247 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() ) 257 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() )
248 258
249 return True 259 return True
250 260
251 def CacheSMaxAgeHandler(self): 261 def CacheSMaxAgeHandler(self):
252 """This request handler yields a page with the title set to the current 262 """This request handler yields a page with the title set to the current
253 system time, and does not allow for caching.""" 263 system time, and does not allow for caching."""
254 264
255 if (self.path.find("/cache/s-maxage") != 0): 265 if not self._ShouldHandleRequest("/cache/s-maxage"):
256 return False 266 return False
257 267
258 self.send_response(200) 268 self.send_response(200)
259 self.send_header('Content-type', 'text/html') 269 self.send_header('Content-type', 'text/html')
260 self.send_header('Cache-Control', 'public, s-maxage = 60, max-age = 0') 270 self.send_header('Cache-Control', 'public, s-maxage = 60, max-age = 0')
261 self.end_headers() 271 self.end_headers()
262 272
263 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() ) 273 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() )
264 274
265 return True 275 return True
266 276
267 def CacheMustRevalidateHandler(self): 277 def CacheMustRevalidateHandler(self):
268 """This request handler yields a page with the title set to the current 278 """This request handler yields a page with the title set to the current
269 system time, and does not allow caching.""" 279 system time, and does not allow caching."""
270 280
271 if (self.path.find("/cache/must-revalidate") != 0): 281 if not self._ShouldHandleRequest("/cache/must-revalidate"):
272 return False 282 return False
273 283
274 self.send_response(200) 284 self.send_response(200)
275 self.send_header('Content-type', 'text/html') 285 self.send_header('Content-type', 'text/html')
276 self.send_header('Cache-Control', 'must-revalidate') 286 self.send_header('Cache-Control', 'must-revalidate')
277 self.end_headers() 287 self.end_headers()
278 288
279 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() ) 289 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() )
280 290
281 return True 291 return True
282 292
283 def CacheMustRevalidateMaxAgeHandler(self): 293 def CacheMustRevalidateMaxAgeHandler(self):
284 """This request handler yields a page with the title set to the current 294 """This request handler yields a page with the title set to the current
285 system time, and does not allow caching event though max-age of 60 295 system time, and does not allow caching event though max-age of 60
286 seconds is specified.""" 296 seconds is specified."""
287 297
288 if (self.path.find("/cache/must-revalidate/max-age") != 0): 298 if not self._ShouldHandleRequest("/cache/must-revalidate/max-age"):
289 return False 299 return False
290 300
291 self.send_response(200) 301 self.send_response(200)
292 self.send_header('Content-type', 'text/html') 302 self.send_header('Content-type', 'text/html')
293 self.send_header('Cache-Control', 'max-age=60, must-revalidate') 303 self.send_header('Cache-Control', 'max-age=60, must-revalidate')
294 self.end_headers() 304 self.end_headers()
295 305
296 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() ) 306 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() )
297 307
298 return True 308 return True
299 309
300
301 def CacheNoStoreHandler(self): 310 def CacheNoStoreHandler(self):
302 """This request handler yields a page with the title set to the current 311 """This request handler yields a page with the title set to the current
303 system time, and does not allow the page to be stored.""" 312 system time, and does not allow the page to be stored."""
304 313
305 if (self.path.find("/cache/no-store") != 0): 314 if not self._ShouldHandleRequest("/cache/no-store"):
306 return False 315 return False
307 316
308 self.send_response(200) 317 self.send_response(200)
309 self.send_header('Content-type', 'text/html') 318 self.send_header('Content-type', 'text/html')
310 self.send_header('Cache-Control', 'no-store') 319 self.send_header('Cache-Control', 'no-store')
311 self.end_headers() 320 self.end_headers()
312 321
313 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() ) 322 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() )
314 323
315 return True 324 return True
316 325
317 def CacheNoStoreMaxAgeHandler(self): 326 def CacheNoStoreMaxAgeHandler(self):
318 """This request handler yields a page with the title set to the current 327 """This request handler yields a page with the title set to the current
319 system time, and does not allow the page to be stored even though max-age 328 system time, and does not allow the page to be stored even though max-age
320 of 60 seconds is specified.""" 329 of 60 seconds is specified."""
321 330
322 if (self.path.find("/cache/no-store/max-age") != 0): 331 if not self._ShouldHandleRequest("/cache/no-store/max-age"):
323 return False 332 return False
324 333
325 self.send_response(200) 334 self.send_response(200)
326 self.send_header('Content-type', 'text/html') 335 self.send_header('Content-type', 'text/html')
327 self.send_header('Cache-Control', 'max-age=60, no-store') 336 self.send_header('Cache-Control', 'max-age=60, no-store')
328 self.end_headers() 337 self.end_headers()
329 338
330 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() ) 339 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() )
331 340
332 return True 341 return True
333 342
334 343
335 def CacheNoTransformHandler(self): 344 def CacheNoTransformHandler(self):
336 """This request handler yields a page with the title set to the current 345 """This request handler yields a page with the title set to the current
337 system time, and does not allow the content to transformed during 346 system time, and does not allow the content to transformed during
338 user-agent caching""" 347 user-agent caching"""
339 348
340 if (self.path.find("/cache/no-transform") != 0): 349 if not self._ShouldHandleRequest("/cache/no-transform"):
341 return False 350 return False
342 351
343 self.send_response(200) 352 self.send_response(200)
344 self.send_header('Content-type', 'text/html') 353 self.send_header('Content-type', 'text/html')
345 self.send_header('Cache-Control', 'no-transform') 354 self.send_header('Cache-Control', 'no-transform')
346 self.end_headers() 355 self.end_headers()
347 356
348 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() ) 357 self.wfile.write('<html><head><title>%s</title></head></html>' % time.time() )
349 358
350 return True 359 return True
351 360
352 def EchoHeader(self): 361 def EchoHeader(self):
353 """This handler echoes back the value of a specific request header.""" 362 """This handler echoes back the value of a specific request header."""
354 363
355 if self.path.find("/echoheader") != 0: 364 if not self._ShouldHandleRequest("/echoheader"):
356 return False 365 return False
357 366
358 query_char = self.path.find('?') 367 query_char = self.path.find('?')
359 if query_char != -1: 368 if query_char != -1:
360 header_name = self.path[query_char+1:] 369 header_name = self.path[query_char+1:]
361 370
362 self.send_response(200) 371 self.send_response(200)
363 self.send_header('Content-type', 'text/plain') 372 self.send_header('Content-type', 'text/plain')
364 self.send_header('Cache-control', 'max-age=60000') 373 self.send_header('Cache-control', 'max-age=60000')
365 # insert a vary header to properly indicate that the cachability of this 374 # insert a vary header to properly indicate that the cachability of this
366 # request is subject to value of the request header being echoed. 375 # request is subject to value of the request header being echoed.
367 if len(header_name) > 0: 376 if len(header_name) > 0:
368 self.send_header('Vary', header_name) 377 self.send_header('Vary', header_name)
369 self.end_headers() 378 self.end_headers()
370 379
371 if len(header_name) > 0: 380 if len(header_name) > 0:
372 self.wfile.write(self.headers.getheader(header_name)) 381 self.wfile.write(self.headers.getheader(header_name))
373 382
374 return True 383 return True
375 384
376 def EchoHandler(self): 385 def EchoHandler(self):
377 """This handler just echoes back the payload of the request, for testing 386 """This handler just echoes back the payload of the request, for testing
378 form submission.""" 387 form submission."""
379 388
380 if self.path.find("/echo") != 0: 389 if not self._ShouldHandleRequest("/echo"):
381 return False 390 return False
382 391
383 self.send_response(200) 392 self.send_response(200)
384 self.send_header('Content-type', 'text/html') 393 self.send_header('Content-type', 'text/html')
385 self.end_headers() 394 self.end_headers()
386 length = int(self.headers.getheader('content-length')) 395 length = int(self.headers.getheader('content-length'))
387 request = self.rfile.read(length) 396 request = self.rfile.read(length)
388 self.wfile.write(request) 397 self.wfile.write(request)
389 return True 398 return True
390 399
391 def EchoTitleHandler(self): 400 def EchoTitleHandler(self):
392 """This handler is like Echo, but sets the page title to the request.""" 401 """This handler is like Echo, but sets the page title to the request."""
393 402
394 if self.path.find("/echotitle") != 0: 403 if not self._ShouldHandleRequest("/echotitle"):
395 return False 404 return False
396 405
397 self.send_response(200) 406 self.send_response(200)
398 self.send_header('Content-type', 'text/html') 407 self.send_header('Content-type', 'text/html')
399 self.end_headers() 408 self.end_headers()
400 length = int(self.headers.getheader('content-length')) 409 length = int(self.headers.getheader('content-length'))
401 request = self.rfile.read(length) 410 request = self.rfile.read(length)
402 self.wfile.write('<html><head><title>') 411 self.wfile.write('<html><head><title>')
403 self.wfile.write(request) 412 self.wfile.write(request)
404 self.wfile.write('</title></head></html>') 413 self.wfile.write('</title></head></html>')
405 return True 414 return True
406 415
407 def EchoAllHandler(self): 416 def EchoAllHandler(self):
408 """This handler yields a (more) human-readable page listing information 417 """This handler yields a (more) human-readable page listing information
409 about the request header & contents.""" 418 about the request header & contents."""
410 419
411 if self.path.find("/echoall") != 0: 420 if not self._ShouldHandleRequest("/echoall"):
412 return False 421 return False
413 422
414 self.send_response(200) 423 self.send_response(200)
415 self.send_header('Content-type', 'text/html') 424 self.send_header('Content-type', 'text/html')
416 self.end_headers() 425 self.end_headers()
417 self.wfile.write('<html><head><style>' 426 self.wfile.write('<html><head><style>'
418 'pre { border: 1px solid black; margin: 5px; padding: 5px }' 427 'pre { border: 1px solid black; margin: 5px; padding: 5px }'
419 '</style></head><body>' 428 '</style></head><body>'
420 '<div style="float: right">' 429 '<div style="float: right">'
421 '<a href="http://localhost:8888/echo">back to referring page</a></div>' 430 '<a href="http://localhost:8888/echo">back to referring page</a></div>'
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 while self.server.waitForDownload: 483 while self.server.waitForDownload:
475 self.server.handle_request() 484 self.server.handle_request()
476 485
477 # Second chunk of data: 486 # Second chunk of data:
478 self.wfile.write("*" * size_chunk2) 487 self.wfile.write("*" * size_chunk2)
479 return True 488 return True
480 489
481 def DownloadFinishHandler(self): 490 def DownloadFinishHandler(self):
482 """This handler just tells the server to finish the current download.""" 491 """This handler just tells the server to finish the current download."""
483 492
484 if not self.path.startswith("/download-finish"): 493 if not self._ShouldHandleRequest("/download-finish"):
485 return False 494 return False
486 495
487 self.server.waitForDownload = False 496 self.server.waitForDownload = False
488 self.send_response(200) 497 self.send_response(200)
489 self.send_header('Content-type', 'text/html') 498 self.send_header('Content-type', 'text/html')
490 self.send_header('Cache-Control', 'max-age=0') 499 self.send_header('Cache-Control', 'max-age=0')
491 self.end_headers() 500 self.end_headers()
492 return True 501 return True
493 502
494 def FileHandler(self): 503 def FileHandler(self):
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 self.wfile.write("you do not support bzip2 encoding") 618 self.wfile.write("you do not support bzip2 encoding")
610 except: 619 except:
611 self.send_error(404) 620 self.send_error(404)
612 621
613 return True 622 return True
614 623
615 def AuthBasicHandler(self): 624 def AuthBasicHandler(self):
616 """This handler tests 'Basic' authentication. It just sends a page with 625 """This handler tests 'Basic' authentication. It just sends a page with
617 title 'user/pass' if you succeed.""" 626 title 'user/pass' if you succeed."""
618 627
619 if not self.path.startswith("/auth-basic"): 628 if not self._ShouldHandleRequest("/auth-basic"):
620 return False 629 return False
621 630
622 username = userpass = password = b64str = "" 631 username = userpass = password = b64str = ""
623 632
624 auth = self.headers.getheader('authorization') 633 auth = self.headers.getheader('authorization')
625 try: 634 try:
626 if not auth: 635 if not auth:
627 raise Exception('no auth') 636 raise Exception('no auth')
628 b64str = re.findall(r'Basic (\S+)', auth)[0] 637 b64str = re.findall(r'Basic (\S+)', auth)[0]
629 userpass = base64.b64decode(b64str) 638 userpass = base64.b64decode(b64str)
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
665 self.wfile.write('</head><body>') 674 self.wfile.write('</head><body>')
666 self.wfile.write('auth=%s<p>' % auth) 675 self.wfile.write('auth=%s<p>' % auth)
667 self.wfile.write('</body></html>') 676 self.wfile.write('</body></html>')
668 677
669 return True 678 return True
670 679
671 def AuthDigestHandler(self): 680 def AuthDigestHandler(self):
672 """This handler tests 'Digest' authentication. It just sends a page with 681 """This handler tests 'Digest' authentication. It just sends a page with
673 title 'user/pass' if you succeed.""" 682 title 'user/pass' if you succeed."""
674 683
675 if not self.path.startswith("/auth-digest"): 684 if not self._ShouldHandleRequest("/auth-digest"):
676 return False 685 return False
677 686
678 # Periodically generate a new nonce. Technically we should incorporate 687 # Periodically generate a new nonce. Technically we should incorporate
679 # the request URL into this, but we don't care for testing. 688 # the request URL into this, but we don't care for testing.
680 nonce_life = 10 689 nonce_life = 10
681 stale = False 690 stale = False
682 if not self.server.nonce or (time.time() - self.server.nonce_time > nonce_li fe): 691 if not self.server.nonce or (time.time() - self.server.nonce_time > nonce_li fe):
683 if self.server.nonce: 692 if self.server.nonce:
684 stale = True 693 stale = True
685 self.server.nonce_time = time.time() 694 self.server.nonce_time = time.time()
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
753 self.wfile.write('</head><body>') 762 self.wfile.write('</head><body>')
754 self.wfile.write('auth=%s<p>' % auth) 763 self.wfile.write('auth=%s<p>' % auth)
755 self.wfile.write('pairs=%s<p>' % pairs) 764 self.wfile.write('pairs=%s<p>' % pairs)
756 self.wfile.write('</body></html>') 765 self.wfile.write('</body></html>')
757 766
758 return True 767 return True
759 768
760 def SlowServerHandler(self): 769 def SlowServerHandler(self):
761 """Wait for the user suggested time before responding. The syntax is 770 """Wait for the user suggested time before responding. The syntax is
762 /slow?0.5 to wait for half a second.""" 771 /slow?0.5 to wait for half a second."""
763 if not self.path.startswith("/slow"): 772 if not self._ShouldHandleRequest("/slow"):
764 return False 773 return False
765 query_char = self.path.find('?') 774 query_char = self.path.find('?')
766 wait_sec = 1.0 775 wait_sec = 1.0
767 if query_char >= 0: 776 if query_char >= 0:
768 try: 777 try:
769 wait_sec = int(self.path[query_char + 1:]) 778 wait_sec = int(self.path[query_char + 1:])
770 except ValueError: 779 except ValueError:
771 pass 780 pass
772 time.sleep(wait_sec) 781 time.sleep(wait_sec)
773 self.send_response(200) 782 self.send_response(200)
774 self.send_header('Content-type', 'text/plain') 783 self.send_header('Content-type', 'text/plain')
775 self.end_headers() 784 self.end_headers()
776 self.wfile.write("waited %d seconds" % wait_sec) 785 self.wfile.write("waited %d seconds" % wait_sec)
777 return True 786 return True
778 787
779 def ContentTypeHandler(self): 788 def ContentTypeHandler(self):
780 """Returns a string of html with the given content type. E.g., 789 """Returns a string of html with the given content type. E.g.,
781 /contenttype?text/css returns an html file with the Content-Type 790 /contenttype?text/css returns an html file with the Content-Type
782 header set to text/css.""" 791 header set to text/css."""
783 if not self.path.startswith('/contenttype'): 792 if not self._ShouldHandleRequest("/contenttype"):
784 return False 793 return False
785 query_char = self.path.find('?') 794 query_char = self.path.find('?')
786 content_type = self.path[query_char + 1:].strip() 795 content_type = self.path[query_char + 1:].strip()
787 if not content_type: 796 if not content_type:
788 content_type = 'text/html' 797 content_type = 'text/html'
789 self.send_response(200) 798 self.send_response(200)
790 self.send_header('Content-Type', content_type) 799 self.send_header('Content-Type', content_type)
791 self.end_headers() 800 self.end_headers()
792 self.wfile.write("<html>\n<body>\n<p>HTML text</p>\n</body>\n</html>\n"); 801 self.wfile.write("<html>\n<body>\n<p>HTML text</p>\n</body>\n</html>\n");
793 return True 802 return True
794 803
795 def ServerRedirectHandler(self): 804 def ServerRedirectHandler(self):
796 """Sends a server redirect to the given URL. The syntax is 805 """Sends a server redirect to the given URL. The syntax is
797 '/server-redirect?http://foo.bar/asdf' to redirect to 'http://foo.bar/asdf'" "" 806 '/server-redirect?http://foo.bar/asdf' to redirect to 'http://foo.bar/asdf'" ""
798 807
799 test_name = "/server-redirect" 808 test_name = "/server-redirect"
800 if not self.path.startswith(test_name): 809 if not self._ShouldHandleRequest(test_name):
801 return False 810 return False
802 811
803 query_char = self.path.find('?') 812 query_char = self.path.find('?')
804 if query_char < 0 or len(self.path) <= query_char + 1: 813 if query_char < 0 or len(self.path) <= query_char + 1:
805 self.sendRedirectHelp(test_name) 814 self.sendRedirectHelp(test_name)
806 return True 815 return True
807 dest = self.path[query_char + 1:] 816 dest = self.path[query_char + 1:]
808 817
809 self.send_response(301) # moved permanently 818 self.send_response(301) # moved permanently
810 self.send_header('Location', dest) 819 self.send_header('Location', dest)
811 self.send_header('Content-type', 'text/html') 820 self.send_header('Content-type', 'text/html')
812 self.end_headers() 821 self.end_headers()
813 self.wfile.write('<html><head>') 822 self.wfile.write('<html><head>')
814 self.wfile.write('</head><body>Redirecting to %s</body></html>' % dest) 823 self.wfile.write('</head><body>Redirecting to %s</body></html>' % dest)
815 824
816 return True; 825 return True;
817 826
818 def ClientRedirectHandler(self): 827 def ClientRedirectHandler(self):
819 """Sends a client redirect to the given URL. The syntax is 828 """Sends a client redirect to the given URL. The syntax is
820 '/client-redirect?http://foo.bar/asdf' to redirect to 'http://foo.bar/asdf'" "" 829 '/client-redirect?http://foo.bar/asdf' to redirect to 'http://foo.bar/asdf'" ""
821 830
822 test_name = "/client-redirect" 831 test_name = "/client-redirect"
823 if not self.path.startswith(test_name): 832 if not self._ShouldHandleRequest(test_name):
824 return False 833 return False
825 834
826 query_char = self.path.find('?'); 835 query_char = self.path.find('?');
827 if query_char < 0 or len(self.path) <= query_char + 1: 836 if query_char < 0 or len(self.path) <= query_char + 1:
828 self.sendRedirectHelp(test_name) 837 self.sendRedirectHelp(test_name)
829 return True 838 return True
830 dest = self.path[query_char + 1:] 839 dest = self.path[query_char + 1:]
831 840
832 self.send_response(200) 841 self.send_response(200)
833 self.send_header('Content-type', 'text/html') 842 self.send_header('Content-type', 'text/html')
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
913 option_parser.add_option('', '--data-dir', dest='data_dir', 922 option_parser.add_option('', '--data-dir', dest='data_dir',
914 help='Directory from which to read the files') 923 help='Directory from which to read the files')
915 option_parser.add_option('', '--https', dest='cert', 924 option_parser.add_option('', '--https', dest='cert',
916 help='Specify that https should be used, specify ' 925 help='Specify that https should be used, specify '
917 'the path to the cert containing the private key ' 926 'the path to the cert containing the private key '
918 'the server should use') 927 'the server should use')
919 options, args = option_parser.parse_args() 928 options, args = option_parser.parse_args()
920 929
921 sys.exit(main(options, args)) 930 sys.exit(main(options, args))
922 931
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698