Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagecell
Path: blob/master/permalink.py
447 views
1
"""
2
Permalink web server
3
4
This Tornado server provides a permalink service with a convenient
5
post/get api for storing and retrieving code.
6
"""
7
8
import base64
9
import json
10
import zlib
11
12
import tornado
13
14
from log import permalink_logger as logger
15
16
17
class PermalinkHandler(tornado.web.RequestHandler):
18
"""
19
Permalink generation request handler.
20
21
This accepts the code and language strings and stores
22
these in the permalink database. A zip and query string are returned.
23
24
The specified id can be used to generate permalinks
25
with the format ``<root_url>?q=<id>``.
26
"""
27
28
async def post(self):
29
def encode(s):
30
return base64.urlsafe_b64encode(
31
zlib.compress(s.encode("utf8"))).decode("utf8")
32
33
args = self.request.arguments
34
logger.debug("Storing permalink %s", args)
35
code = self.get_argument("code")
36
language = self.get_argument("language", "sage")
37
interacts = self.get_argument("interacts", "[]")
38
retval = {}
39
retval["zip"] = encode(code)
40
retval["query"] = await self.application.db.add(
41
code, language, interacts)
42
retval["interacts"] = encode(interacts)
43
if "n" in args:
44
retval["n"] = int(self.get_argument("n"))
45
if "frame" in args:
46
retval = ('<script>parent.postMessage(%r,"*");</script>'
47
% json.dumps(retval))
48
self.set_header("Content-Type", "text/html")
49
else:
50
self.set_header("Access-Control-Allow-Origin",
51
self.request.headers.get("Origin", "*"))
52
self.set_header("Access-Control-Allow-Credentials", "true")
53
self.write(retval)
54
self.finish()
55
56
async def get(self):
57
q = self.get_argument("q")
58
try:
59
logger.debug("Looking up permalink %s", q)
60
response = await self.application.db.get(q)
61
except LookupError:
62
logger.warning("ID not found in permalink database %s", q)
63
self.set_status(404)
64
self.finish("ID not found in permalink database")
65
return
66
response = json.dumps(response)
67
if self.get_arguments("callback"):
68
self.write("%s(%r);" % (self.get_argument("callback"), response))
69
self.set_header("Content-Type", "application/javascript")
70
else:
71
self.write(response)
72
self.set_header("Access-Control-Allow-Origin",
73
self.request.headers.get("Origin", "*"))
74
self.set_header("Access-Control-Allow-Credentials", "true")
75
self.set_header("Content-Type", "application/json")
76
self.finish()
77
78