SSL support: Use the "certifi" library's certificate bundles if available
[zeroinstall/solver.git] / tests / server.py
blobbef78d57d7299ec6ed94fbc35158b57139941b57
1 #!/usr/bin/env python
3 from __future__ import print_function
5 import os, sys, urlparse
6 import BaseHTTPServer
7 import traceback
9 next_step = None
11 class Give404:
12 def __init__(self, path):
13 self.path = path
15 def __str__(self):
16 return self.path
18 def __repr__(self):
19 return "404 on " + self.path
21 class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
22 def do_GET(self):
23 parsed = urlparse.urlparse(self.path)
25 print(parsed)
26 if parsed.path.startswith('/redirect/'):
27 self.send_response(302)
28 self.wfile.write('Location: /' + parsed.path[1:].split('/', 1)[1])
29 return
31 leaf = os.path.basename(parsed.path)
33 acceptable = dict([(str(x), x) for x in next_step])
35 resp = acceptable.get(parsed.path, None) or \
36 acceptable.get(leaf, None) or \
37 acceptable.get('*', None)
39 # (don't use a symlink as they don't work on Windows)
40 if leaf == 'latest.xml':
41 leaf = 'Hello.xml'
43 if not resp:
44 self.send_error(404, "Expected %s; got %s" % (next_step, parsed.path))
45 elif parsed.path.startswith('/key-info/'):
46 self.send_response(200)
47 self.end_headers()
48 self.wfile.write('<key-lookup><item vote="good">Approved for testing</item></key-lookup>')
49 self.wfile.close()
50 elif os.path.exists(leaf) and not isinstance(resp, Give404):
51 self.send_response(200)
52 self.end_headers()
53 self.wfile.write(open(leaf).read())
54 self.wfile.close()
55 else:
56 self.send_error(404, "Missing: %s" % leaf)
58 def handle_requests(*script):
59 server_address = ('localhost', 8000)
60 httpd = BaseHTTPServer.HTTPServer(server_address, MyHandler)
61 child = os.fork()
62 if child:
63 return child
64 # We are the child
65 try:
66 sys.stderr = sys.stdout
67 #sys.stdout = sys.stderr
68 print("Waiting for request")
69 global next_step
70 for next_step in script:
71 if type(next_step) != tuple: next_step = (next_step,)
72 for x in next_step:
73 httpd.handle_request()
74 print("Done")
75 os._exit(0)
76 except:
77 traceback.print_exc()
78 os._exit(1)