Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Newer
Older
100755 100 lines (78 sloc) 2.717 kB
ef0440b @rnewson Python variant of couchdb external hook.
authored
1 #!/usr/bin/python
2
416a059 @davisp Refactored the external hook a bit.
davisp authored
3 import httplib
4 import optparse as op
5 import sys
6 import traceback
9e37cdb @rnewson url escape query parameters.
authored
7 import urllib
7217c19 @rnewson simplify Python script.
authored
8
ef0440b @rnewson Python variant of couchdb external hook.
authored
9 try:
10 import json
11 except:
12 import simplejson as json
13
416a059 @davisp Refactored the external hook a bit.
davisp authored
14 __usage__ = "%prog [OPTIONS]"
15
082b7da @rnewson httplib lower-cases HTTP responses headers -- so fix that ourselves.
authored
16 httpdict = {"etag":"ETag", "content-type":"Content-Type"}
17
416a059 @davisp Refactored the external hook a bit.
davisp authored
18 def options():
19 return [
cbfe065 @rnewson remove registry and indexkey, change output paths
authored
20 op.make_option('--remote-host', dest='remote_host',
21 default="localhost",
b9dc7a9 @rnewson fix external hook and external documentation.
authored
22 help="Hostname of the couchdb-lucene server. [%default]"),
cbfe065 @rnewson remove registry and indexkey, change output paths
authored
23 op.make_option('--remote-port', dest='remote_port', type='int',
416a059 @davisp Refactored the external hook a bit.
davisp authored
24 default=5985,
b9dc7a9 @rnewson fix external hook and external documentation.
authored
25 help="Port of the couchdb-lucene server. [%default]"),
4912c84 @rnewson fix external hook for ini changes.
authored
26 op.make_option('--local-key', dest='key',
27 default="local",
28 help="Configured key name for this couchdb instance. [%default]"),
416a059 @davisp Refactored the external hook a bit.
davisp authored
29 ]
30
31 def main():
32 parser = op.OptionParser(usage=__usage__, option_list=options())
33 opts, args = parser.parse_args()
34
35 if len(args):
36 parser.error("Unrecognized arguments: %s" % ' '.join(args))
caccea4 @rnewson avoid JSON object encoding problem by changing multiple query feature…
authored
37 for req in requests():
54cc92b @rnewson don't reuse connection as httplib has buggy persistent connection sup…
authored
38 res = httplib.HTTPConnection(opts.remote_host, opts.remote_port)
416a059 @davisp Refactored the external hook a bit.
davisp authored
39 try:
caccea4 @rnewson avoid JSON object encoding problem by changing multiple query feature…
authored
40 resp = respond(res, req, opts.key)
416a059 @davisp Refactored the external hook a bit.
davisp authored
41 except Exception, e:
42 body = traceback.format_exc()
43 resp = mkresp(500, body, {"Content-Type": "text/plain"})
44
54cc92b @rnewson don't reuse connection as httplib has buggy persistent connection sup…
authored
45 res.close()
416a059 @davisp Refactored the external hook a bit.
davisp authored
46 sys.stdout.write(json.dumps(resp))
47 sys.stdout.write("\n")
48 sys.stdout.flush()
49
ef0440b @rnewson Python variant of couchdb external hook.
authored
50 def requests():
51 line = sys.stdin.readline()
52 while line:
caccea4 @rnewson avoid JSON object encoding problem by changing multiple query feature…
authored
53 yield json.loads(line)
ef0440b @rnewson Python variant of couchdb external hook.
authored
54 line = sys.stdin.readline()
55
caccea4 @rnewson avoid JSON object encoding problem by changing multiple query feature…
authored
56 def respond(res, req, key):
416a059 @davisp Refactored the external hook a bit.
davisp authored
57 path = req.get("path", [])
989c04a @rnewson make Python external hook script work for cache hits too.
authored
58
980372a @rnewson tidy up python script
authored
59 # Drop name of external hook.
60 del path[1]
18b332e @rnewson consolidate all servlets into one. this makes URL's more RESTful and …
authored
61
c11d33e @rnewson handle databases with embedded slashes
authored
62 # URL-escape each part
63 for index, item in enumerate(path):
64 path[index] = urllib.quote(path[index], "")
980372a @rnewson tidy up python script
authored
65
18b332e @rnewson consolidate all servlets into one. this makes URL's more RESTful and …
authored
66 path = '/'.join(['', key] + path)
caccea4 @rnewson avoid JSON object encoding problem by changing multiple query feature…
authored
67 params = urllib.urlencode(dict([k, v.encode('utf-8')] for k, v in req["query"].items()))
68 path = '?'.join([path, params])
24c528e @rnewson allow -u/--url= override for couchdb-lucene location.
authored
69
989c04a @rnewson make Python external hook script work for cache hits too.
authored
70 req_headers = {}
416a059 @davisp Refactored the external hook a bit.
davisp authored
71 for h in req.get("headers", []):
72 if h.lower() in ["accept", "if-none-match"]:
989c04a @rnewson make Python external hook script work for cache hits too.
authored
73 req_headers[h] = req["headers"][h]
416a059 @davisp Refactored the external hook a bit.
davisp authored
74
f4799dc @rnewson handle older Python versions in hook script.
authored
75 # verb renamed to method in 0.11 onwards.
76 if "method" in req:
77 method = req["method"]
78 else:
79 method = req["verb"]
b7c592f @rnewson more fixes for new _cleanup method.
authored
80
ddfd64d @rnewson allow either 'verb' or 'method' in req object.
authored
81 res.request(method, path, headers=req_headers)
416a059 @davisp Refactored the external hook a bit.
davisp authored
82 resp = res.getresponse()
989c04a @rnewson make Python external hook script work for cache hits too.
authored
83
84 resp_headers = {}
85 for h, v in resp.getheaders():
082b7da @rnewson httplib lower-cases HTTP responses headers -- so fix that ourselves.
authored
86 if h.lower() in httpdict:
87 resp_headers[httpdict[h]] = resp.getheader(h, [])
989c04a @rnewson make Python external hook script work for cache hits too.
authored
88
89 return mkresp(resp.status, resp.read(), resp_headers)
416a059 @davisp Refactored the external hook a bit.
davisp authored
90
91 def mkresp(code, body, headers=None):
92 ret = {"code": code, "body": body}
93 if headers is not None:
94 ret["headers"] = headers
95 return ret
ef0440b @rnewson Python variant of couchdb external hook.
authored
96
97 if __name__ == "__main__":
98 main()
416a059 @davisp Refactored the external hook a bit.
davisp authored
99
Something went wrong with that request. Please try again.