From 9d80eef9529e98b2161c2a1247eaf23c18d3ad88 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Wed, 29 Apr 2015 16:34:13 -0400 Subject: [PATCH] add web_server.py for testing web content Actually testing the web content for elastic recheck was a bit annoying because it involved manually downloading json files and modifying html files to point at a local server. This means that we often pushed changes without testing them, sometimes with not so great results. This uses the stdlib BaseHTTPServer to build a fake local server that runs on port 8001 and provides a local experience that pretends pretty damn hard to be like hitting the live site. All local files are served up statically. All references to upstream .json files are rewriten into local server urls, and fetching of .json files that we don't have in a local tree are automatically proxied out to live data on status.openstack.org. Change-Id: I4ae0fc67f8ab440153fc7edca5af77913cc448a7 --- web_server.py | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100755 web_server.py diff --git a/web_server.py b/web_server.py new file mode 100755 index 00000000..32b7f759 --- /dev/null +++ b/web_server.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python +# +# Copyright 2015 Hewlett-Packard Development Company, L.P. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +""" +This is a simple test server that serves up the web content locally +as if it was a working remote server. It also proxies all the live +date/*.json files into the local test server, so that the Ajax async +loading works without hitting Cross Site Scripting violations. +""" + +import argparse +import BaseHTTPServer +import os.path +import urllib2 + +SERVER_UPSTREAM = "http://status.openstack.org/elastic-recheck" + + +class ERHandler(BaseHTTPServer.BaseHTTPRequestHandler): + """A request handler to create a magic local ER server""" + + def do_GET(self): + # redirect to elastic recheck page + if self.path == "/": + self.path = "/index.html" + + # if the file exists locally, we'll serve it up directly + fname = "web/share" + self.path + if os.path.isfile(fname): + self.send_response(200, "Success") + self.end_headers() + with open(fname) as f: + for line in f.readlines(): + # in order for us to fetch the .json files, we + # need to have them served from our server, + # otherwise browser cross site scripting + # protections kick in. So rewrite content on the + # fly for those redirects. + line = line.replace( + "status.openstack.org/elastic-recheck", + "localhost:%s" % self.server.server_port) + self.wfile.write(line) + return + + # If you've not built local data to test with, instead grab + # the data off the production server on the fly and serve it + # up from our server. + if self.path.startswith("/data/"): + try: + response = urllib2.urlopen("%s%s" % + (SERVER_UPSTREAM, self.path)) + self.send_response(200, "Success") + self.end_headers() + self.wfile.write(response.read()) + except urllib2.HTTPError as e: + self.send_response(e.code) + self.end_headers() + self.wfile.write(e.read()) + return + + # Fall through for paths we don't understand + print "Unknown path requested: %s" % self.path + + +def parse_opts(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('-p', '--port', + help='port to bind to [default: 8001]', + type=int, + default=8001) + return parser.parse_args() + + +def main(): + opts = parse_opts() + server_address = ('', opts.port) + httpd = BaseHTTPServer.HTTPServer(server_address, ERHandler) + + print "Test Server is running at http://localhost:%s" % opts.port + print "Ctrl-C to exit" + print + + while True: + httpd.handle_request() + +if __name__ == '__main__': + try: + main() + except KeyboardInterrupt: + print "\n" + print "Thanks for testing! Please come again."