Skip to content

Instantly share code, notes, and snippets.

@rndmcnlly
Created December 6, 2009 03:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save rndmcnlly/250031 to your computer and use it in GitHub Desktop.
Save rndmcnlly/250031 to your computer and use it in GitHub Desktop.
#!/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