mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
DirtySDK (EA's Dirty Sockets library) will be used for the LiveAPI implementation, and depends on: EABase, EAThread.
114 lines
2.8 KiB
Python
114 lines
2.8 KiB
Python
from SocketServer import ThreadingMixIn
|
|
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
|
|
import sys
|
|
import time
|
|
import optparse
|
|
import os
|
|
import uuid
|
|
|
|
errorcode = 404
|
|
tmp_dir = 'twtmp'
|
|
|
|
class NormalHandler(BaseHTTPRequestHandler):
|
|
def do_GET(self):
|
|
self.do_all()
|
|
|
|
def do_POST(self):
|
|
global tmp_dir
|
|
length = long(self.headers.getheader('content-length'))
|
|
chunk = self.rfile.read(length)
|
|
|
|
fname = os.path.join(tmp_dir, str(uuid.uuid1()))
|
|
fout = file(fname, 'wb')
|
|
fout.write(chunk)
|
|
fout.close()
|
|
|
|
fsize = os.path.getsize(fname)
|
|
|
|
self.do_all([fname, str(fsize)])
|
|
|
|
def do_HEAD(self):
|
|
self.do_all()
|
|
|
|
def do_PUT(self):
|
|
self.do_all();
|
|
|
|
def do_DELETE(self):
|
|
self.do_all();
|
|
|
|
def do_all(self, response=[]):
|
|
self.send_response(200)
|
|
self.send_header('Content-type','text/plain')
|
|
self.end_headers()
|
|
self.wfile.write(self.path+'\n')
|
|
for r in response:
|
|
self.wfile.write(r+'\n')
|
|
|
|
class NoResponseHandler(BaseHTTPRequestHandler):
|
|
def do_GET(self):
|
|
self.do_all()
|
|
|
|
def do_POST(self):
|
|
self.do_all()
|
|
|
|
def do_all(self):
|
|
pass
|
|
|
|
class SlowResponseHandler(BaseHTTPRequestHandler):
|
|
def do_GET(self):
|
|
self.do_all()
|
|
|
|
def do_POST(self):
|
|
self.do_all()
|
|
|
|
def do_all(self):
|
|
time.sleep(30)
|
|
self.send_response(200)
|
|
self.send_header('Content-type','text/plain')
|
|
self.end_headers()
|
|
self.wfile.write(self.path)
|
|
|
|
class ErrorResponseHandler(BaseHTTPRequestHandler):
|
|
def do_GET(self):
|
|
self.do_all()
|
|
|
|
def do_POST(self):
|
|
self.do_all()
|
|
|
|
def do_all(self):
|
|
global errorcode
|
|
self.send_response(errorcode)
|
|
self.send_header('Content-type','text/plain')
|
|
self.end_headers()
|
|
self.wfile.write(self.path)
|
|
|
|
class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
|
|
pass
|
|
|
|
handlers = {'normal':NormalHandler, 'noresponse':NoResponseHandler, 'slow':SlowResponseHandler, 'error':ErrorResponseHandler}
|
|
|
|
parser = optparse.OptionParser(usage = '%prog --ip=IP --port=PORT --handler=HANDLER --error=ERROR')
|
|
parser.add_option('-i', '--ip', dest='ip',
|
|
help='listen on ip', metavar='IP')
|
|
parser.add_option('-p', '--port', dest='port', type=int, default=9000,
|
|
help='listen on port PORT', metavar='PORT')
|
|
parser.add_option('-l', '--handler', dest='handler',
|
|
help='how to respond', metavar='HANDLER')
|
|
parser.add_option('-e', '--error', dest='error', type=int,
|
|
help='what error to respond with', metavar='ERROR')
|
|
|
|
opts, args = parser.parse_args()
|
|
|
|
ip = opts.ip
|
|
port = opts.port
|
|
handler = opts.handler
|
|
if opts.error:
|
|
errorcode = opts.error
|
|
|
|
if not os.path.exists(tmp_dir):
|
|
os.mkdir(tmp_dir)
|
|
|
|
|
|
server = ThreadingHTTPServer((ip, port), handlers[handler])
|
|
server.serve_forever()
|