-
Notifications
You must be signed in to change notification settings - Fork 1
/
server.py
86 lines (73 loc) · 2.71 KB
/
server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import urlparse
import cgi
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from nif import Wrapper
PORT = 8001
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
"""
This method receives a GET request and handles it.
"""
if self.path.startswith("/service"):
path = urlparse.parse_qs(self.path.split("?")[1])
input_text, options = self.qs2options(path)
self.response(input_text, options)
else:
self.send_error(404, "File not found")
def do_POST(self):
"""
This method receives a POST request and handles it.
"""
if self.path.startswith("/service"):
length = int(self.headers.getheader('content-length'))
qs = self.rfile.read(length)
para = cgi.parse_qs(qs, keep_blank_values=1)
input_text, options = self.qs2options(para)
self.response(input_text, options)
else:
self.send_error(404, "File not found")
def response(self, input_text, options):
"""
This method proceeds the given operation and returns
a HTTP response.
"""
wrapper = Wrapper(input_text, options)
rdf = wrapper.nlp2rdf()
self.send_response(200)
if options.get('format') == "n3":
self.send_header('Content-type','text/n3')
elif options.get('format') == "ntriples":
self.send_header('Content-type','text/plain')
elif options.get('format') == "turtle":
self.send_header('Content-type','text/turtle')
else:
self.send_header('Content-type','application/rdf+xml')
self.end_headers()
self.wfile.write(rdf)
def qs2options(self, qs):
"""
Converts a query string dictionary into a
modified options dictionary.
"""
try:
input_type = qs["input-type"][0]
input_text = qs["input"][0]
except KeyError:
self.send_error(500, "Missed required parameters")
opt = lambda x:x[0] if x else None
options = {
'nif': opt(qs.get('nif')),
'format': opt(qs.get('format')),
'prefix': opt(qs.get('prefix')),
'urirecipe': qs.get('urirecipe')[0] if qs.get('urirecipe') else "offset",
'context-length': int(qs.get('context-length')[0]) if qs.get('context-length') else 10
}
return (input_text, options)
if __name__ == "__main__":
try:
server = HTTPServer(('', PORT), MyHandler)
print "server running at", PORT
server.serve_forever()
except KeyboardInterrupt:
print "bye bye.."
server.socket.close()