aboutsummaryrefslogtreecommitdiffstats
path: root/serve.py
diff options
context:
space:
mode:
authorFilipp Lepalaan <filipp@mac.com>2018-04-28 16:35:19 +0300
committerFilipp Lepalaan <filipp@mac.com>2018-04-28 16:35:19 +0300
commitf438b1221354469a9ce50f591eba7272f2698526 (patch)
treed37ece85dd2b98bfd165a232c1d367aaf9534801 /serve.py
downloadgsx-mockserver-f438b1221354469a9ce50f591eba7272f2698526.tar.gz
gsx-mockserver-f438b1221354469a9ce50f591eba7272f2698526.tar.bz2
gsx-mockserver-f438b1221354469a9ce50f591eba7272f2698526.zip
Initial commit
Diffstat (limited to 'serve.py')
-rwxr-xr-xserve.py77
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()