diff options
author | Filipp Lepalaan <filipp@mac.com> | 2018-04-28 16:35:19 +0300 |
---|---|---|
committer | Filipp Lepalaan <filipp@mac.com> | 2018-04-28 16:35:19 +0300 |
commit | f438b1221354469a9ce50f591eba7272f2698526 (patch) | |
tree | d37ece85dd2b98bfd165a232c1d367aaf9534801 /serve.py | |
download | gsx-mockserver-f438b1221354469a9ce50f591eba7272f2698526.tar.gz gsx-mockserver-f438b1221354469a9ce50f591eba7272f2698526.tar.bz2 gsx-mockserver-f438b1221354469a9ce50f591eba7272f2698526.zip |
Initial commit
Diffstat (limited to 'serve.py')
-rwxr-xr-x | serve.py | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/serve.py b/serve.py new file mode 100755 index 0000000..433e740 --- /dev/null +++ b/serve.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python + +import os +import argparse +from glob import glob +from io import BytesIO +from string import Template + +try: + from http.server import BaseHTTPRequestHandler, HTTPServer +except ImportError: + from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer + +from lxml import etree + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + assert self.headers['SOAPAction'], 'Invalid request' + + self.action = self.headers['SOAPAction'].strip('"') + self.path = 'responses/%s.xml' % self.action + self.log_message(self.action) + + if not os.path.exists(self.path): + msg = 'Sorry, unkown action %s' % self.action + self.send_error(404, msg) + return + + self.send_response(200) + l = int(self.headers['Content-Length']) + request = etree.parse(BytesIO(self.rfile.read(l))) + + print(etree.tostring(request, pretty_print=True).decode()) + + context = {} + r = request.xpath('//repairData|//requestData|//MarkRepairCompleteRequest') + + if r: + for i in r[0].iterchildren(): + context[i.tag] = i.text + + self.send_header('Content-Type', 'text/xml; charset="UTF-8"') + self.end_headers() + + with open(self.path, 'r') as f: + xml = f.read() + xml = Template(xml).safe_substitute(context) + self.send_header('Content-Length', len(xml)) + self.wfile.write(xml.encode()) + print(xml) + + +def validate_responses(): + for r in glob('responses/*.xml'): + try: + etree.parse(r) + except etree.XMLSyntaxError: + raise Exception('Invalid XML response: %s' % r) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser = argparse.ArgumentParser() + parser.add_argument('-a', '--address', + help='Address to host server on', default='localhost') + parser.add_argument('-p', '--port', + help='Port number to host server on', default=8080, type=int) + args = parser.parse_args() + + print('Validating XML responses...') + validate_responses() + + with HTTPServer((args.address, args.port), Handler) as httpd: + print('GSX mock server serving on http://%s:%d' % (args.address, args.port)) + httpd.serve_forever() |