-
-
Save progrium/250096 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
from __future__ import with_statement | |
import base64 | |
import PyV8 | |
import time | |
from twisted.application import service, internet | |
from twisted.web import server, resource, client | |
class EvalResource(resource.Resource): | |
def __init__(self, parent_context): | |
self.parent_context = parent_context | |
def render_POST(self, request): | |
b64code = request.requestHeaders.getRawHeaders('X-SCRIPTLETS-RUN-CODE')[0] | |
code = base64.b64decode(b64code) | |
# TODO: threads.deferToThread, setting request timeout | |
try: | |
with PyV8.JSContext(self.parent_context) as context: | |
context.eval(code) | |
app = context.locals.app | |
env = {} # TODO: jsgi compatible-ify the env | |
response = app(env) | |
request.setResponseCode(response.status) | |
headers = PyV8.convert(response.headers) | |
for (k,v) in PyV8.convert(response.headers).items(): | |
request.setHeader(k,v) | |
request.write(str(response.body)) | |
return '' | |
except Exception, e: | |
request.setResponseCode(500) | |
return str(e) | |
class EvalDriverResource(resource.Resource): | |
def render_POST(self, request): | |
code = request.args.get('code', [''])[0] | |
b64code = base64.b64encode(code) | |
def done(page): | |
request.write('<pre>'+page+'</pre>') | |
request.finish() | |
client.getPage( | |
'http://localhost:8123/eval?arg0=zero&q=lolcats', | |
method='POST', | |
headers={ 'X-SCRIPTLETS-RUN-CODE':b64code, | |
'X-SCRIPTLETS-RUN-URL':'http://whatever/i/forgot', | |
'X-SCRIPTLETS-RUN-METHOD':'POST'} | |
).addBoth(done) | |
return server.NOT_DONE_YET | |
class BaseResource(resource.Resource): | |
def render(self, request): | |
return """ | |
<html> | |
<head> | |
<title>New Javascript Engine Driver</title> | |
</head> | |
<body> | |
<h1>Run it!</h1> | |
<form action="/eval_driver" method="POST"> | |
<textarea name="code" rows="10" cols="80"> | |
// a JSGI app, see http://jackjs.org/ | |
function app(env) { | |
return { | |
status : 200, | |
headers : {"Content-Type":"text/plain"}, | |
body : ["Hello world!"] | |
}; | |
}</textarea><br/> | |
<input type="submit" name="submit" value="Run" /> | |
</form> | |
</body> | |
</html> | |
""" | |
class ScriptletsGlobals(PyV8.JSClass): | |
# TODO: expose more stuff? (like however Jack shows the request) | |
def fetch(self, url): | |
page = 'the contents of ' + url + ' go here someday' | |
time.sleep(1.0) | |
return page | |
js_context = PyV8.JSContext(ScriptletsGlobals()) | |
js_context.enter() | |
root = resource.Resource() | |
root.putChild('', BaseResource()) | |
root.putChild('eval', EvalResource(js_context)) | |
root.putChild('eval_driver', EvalDriverResource()) | |
port = 8123 | |
application = service.Application("newscriptlets") | |
service = internet.TCPServer(port, server.Site(root)) | |
service.setServiceParent(application) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment