annotate pythonServer.py @ 1243:9cf727420c29

Python 2.x server can perform intermediate saves.
author Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk>
date Wed, 09 Mar 2016 13:12:02 +0000
parents a4ad9e55b5b8
children ba6b9e1aaef5
rev   line source
djmoffat@1081 1 #!/usr/bin/python
djmoffat@1081 2
BrechtDeMan@881 3 import BaseHTTPServer
BrechtDeMan@881 4 from os import walk
BrechtDeMan@881 5 from os import path
nicholas@882 6 from os import listdir
BrechtDeMan@1058 7 import inspect
BrechtDeMan@1058 8 import os
BrechtDeMan@881 9 import urllib2
n@1243 10 import urlparse
BrechtDeMan@881 11 import pickle
BrechtDeMan@881 12 import datetime
nicholas@10 13
BrechtDeMan@1058 14 # Go to right folder.
BrechtDeMan@1058 15 scriptdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # script directory
BrechtDeMan@1058 16 os.chdir(scriptdir) # does this work?
BrechtDeMan@1058 17
nicholas@882 18 PSEUDO_PATH = 'example_eval/'
nicholas@882 19 pseudo_files = []
nicholas@882 20 for filename in listdir(PSEUDO_PATH):
nicholas@882 21 if filename.endswith('.xml'):
nicholas@882 22 pseudo_files.append(filename)
nicholas@882 23
BrechtDeMan@881 24 curSaveIndex = 0;
BrechtDeMan@881 25 curFileName = 'test-0.xml'
BrechtDeMan@881 26 while(path.isfile('saves/'+curFileName)):
BrechtDeMan@881 27 curSaveIndex += 1;
BrechtDeMan@881 28 curFileName = 'test-'+str(curSaveIndex)+'.xml'
nicholas@10 29
nicholas@882 30 pseudo_index = curSaveIndex % len(pseudo_files)
nicholas@750 31
nicholas@750 32 print 'URL: http://localhost:8000/index.html'
nicholas@10 33
BrechtDeMan@881 34 def send404(s):
BrechtDeMan@881 35 s.send_response(404)
BrechtDeMan@881 36 s.send_header("Content-type", "text/html")
BrechtDeMan@881 37 s.end_headers()
BrechtDeMan@881 38
BrechtDeMan@881 39 def processFile(s):
nicholas@750 40 s.path = s.path.rsplit('?')
nicholas@750 41 s.path = s.path[0]
BrechtDeMan@881 42 s.path = s.path[1:len(s.path)]
BrechtDeMan@881 43 st = s.path.rsplit(',')
BrechtDeMan@881 44 lenSt = len(st)
BrechtDeMan@881 45 fmt = st[lenSt-1].rsplit('.')
BrechtDeMan@881 46 size = path.getsize(urllib2.unquote(s.path))
BrechtDeMan@881 47 fileDump = open(urllib2.unquote(s.path))
BrechtDeMan@881 48 s.send_response(200)
BrechtDeMan@881 49
BrechtDeMan@881 50 if (fmt[1] == 'html'):
BrechtDeMan@881 51 s.send_header("Content-type", 'text/html')
BrechtDeMan@881 52 elif (fmt[1] == 'css'):
BrechtDeMan@881 53 s.send_header("Content-type", 'text/css')
BrechtDeMan@881 54 elif (fmt[1] == 'js'):
BrechtDeMan@881 55 s.send_header("Content-type", 'application/javascript')
BrechtDeMan@881 56 else:
BrechtDeMan@881 57 s.send_header("Content-type", 'application/octet-stream')
BrechtDeMan@881 58 s.send_header("Content-Length", size)
BrechtDeMan@881 59 s.end_headers()
BrechtDeMan@881 60 s.wfile.write(fileDump.read())
BrechtDeMan@881 61 fileDump.close()
n@1243 62
n@1243 63 def keygen(s):
n@1243 64 reply = ""
n@1243 65 options = s.path.rsplit('?')
n@1243 66 options = options[1].rsplit('=')
n@1243 67 key = options[1]
n@1243 68 print key
n@1243 69 if os.path.isfile("saves/save-"+key+".xml"):
n@1243 70 reply = "<response><state>NO</state><key>"+key+"</key></response>"
n@1243 71 else:
n@1243 72 reply = "<response><state>OK</state><key>"+key+"</key></response>"
n@1243 73 s.send_response(200)
n@1243 74 s.send_header("Content-type", "application/xml")
n@1243 75 s.end_headers()
n@1243 76 s.wfile.write(reply)
n@1243 77 file = open("saves/save-"+key+".xml",'w')
n@1243 78 file.write("<waetresult key="+key+"/>")
n@1243 79 file.close();
n@1243 80
BrechtDeMan@881 81 def saveFile(self):
BrechtDeMan@881 82 global curFileName
BrechtDeMan@881 83 global curSaveIndex
n@1243 84 options = self.path.rsplit('?')
n@1243 85 options = options[1].rsplit('=')
n@1243 86 key = options[1]
n@1243 87 print key
BrechtDeMan@881 88 varLen = int(self.headers['Content-Length'])
BrechtDeMan@881 89 postVars = self.rfile.read(varLen)
n@1243 90 print "Saving file key "+key
n@1243 91 file = open('saves/save-'+key+'.xml','w')
BrechtDeMan@881 92 file.write(postVars)
BrechtDeMan@881 93 file.close()
n@749 94 try:
n@1243 95 wbytes = os.path.getsize('saves/save-'+key+'.xml')
n@749 96 except OSError:
n@749 97 self.send_response(200)
n@749 98 self.send_header("Content-type", "text/xml")
n@749 99 self.end_headers()
n@749 100 self.wfile.write('<response state="error"><message>Could not open file</message></response>')
BrechtDeMan@881 101 self.send_response(200)
BrechtDeMan@881 102 self.send_header("Content-type", "text/xml")
BrechtDeMan@881 103 self.end_headers()
n@749 104 self.wfile.write('<response state="OK"><message>OK</message><file bytes="'+str(wbytes)+'">"saves/'+curFileName+'"</file></response>')
n@749 105 curSaveIndex += 1
n@749 106 curFileName = 'test-'+str(curSaveIndex)+'.xml'
nicholas@10 107
BrechtDeMan@881 108 class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
BrechtDeMan@881 109 def do_HEAD(s):
nicholas@882 110 s.send_response(200)
nicholas@882 111 s.send_header("Content-type", "text/html")
nicholas@882 112 s.end_headers()
BrechtDeMan@881 113 def do_GET(request):
nicholas@882 114 global pseudo_index
nicholas@882 115 global pseudo_files
nicholas@882 116 global PSEUDO_PATH
BrechtDeMan@881 117 if(request.client_address[0] == "127.0.0.1"):
BrechtDeMan@881 118 if (request.path == "/favicon.ico"):
BrechtDeMan@881 119 send404(request)
n@1243 120 elif (request.path.split('?',1)[0] == "/keygen.php"):
n@1243 121 keygen(request);
BrechtDeMan@881 122 else:
BrechtDeMan@881 123 if (request.path == '/'):
BrechtDeMan@881 124 request.path = '/index.html'
nicholas@882 125 elif (request.path == '/pseudo.xml'):
nicholas@882 126 request.path = '/'+PSEUDO_PATH + pseudo_files[pseudo_index]
nicholas@882 127 print request.path
nicholas@882 128 pseudo_index += 1
nicholas@882 129 pseudo_index %= len(pseudo_files)
BrechtDeMan@881 130 processFile(request)
BrechtDeMan@881 131 else:
BrechtDeMan@881 132 send404(request)
nicholas@882 133
BrechtDeMan@881 134 def do_POST(request):
BrechtDeMan@881 135 if(request.client_address[0] == "127.0.0.1"):
n@1243 136 if (request.path.rsplit('?',1)[0] == "/save" or request.path.rsplit('?',1)[0] == "/save.php"):
BrechtDeMan@881 137 saveFile(request)
BrechtDeMan@881 138 else:
BrechtDeMan@881 139 send404(request)
BrechtDeMan@881 140
BrechtDeMan@881 141 def run(server_class=BaseHTTPServer.HTTPServer,
BrechtDeMan@881 142 handler_class=MyHandler):
BrechtDeMan@881 143 server_address = ('', 8000)
BrechtDeMan@881 144 httpd = server_class(server_address, handler_class)
BrechtDeMan@881 145 httpd.serve_forever()
BrechtDeMan@881 146
n@1243 147 run()