Skip to content
This repository
Newer
Older
100755 98 lines (78 sloc) 2.717 kb
ef0440b7 »
2009-10-08 Python variant of couchdb external hook.
1 #!/usr/bin/python
2
416a059e » davisp
2009-10-22 Refactored the external hook a bit.
3 import httplib
4 import optparse as op
5 import sys
6 import traceback
9e37cdbf »
2009-10-08 url escape query parameters.
7 import urllib
7217c192 »
2009-10-09 simplify Python script.
8
ef0440b7 »
2009-10-08 Python variant of couchdb external hook.
9 try:
10 import json
11 except:
12 import simplejson as json
13
416a059e » davisp
2009-10-22 Refactored the external hook a bit.
14 __usage__ = "%prog [OPTIONS]"
15
082b7da9 »
2009-12-23 httplib lower-cases HTTP responses headers -- so fix that ourselves.
16 httpdict = {"etag":"ETag", "content-type":"Content-Type"}
17
416a059e » davisp
2009-10-22 Refactored the external hook a bit.
18 def options():
19 return [
cbfe0656 »
2009-11-24 remove registry and indexkey, change output paths
20 op.make_option('--remote-host', dest='remote_host',
21 default="localhost",
b9dc7a90 »
2009-11-20 fix external hook and external documentation.
22 help="Hostname of the couchdb-lucene server. [%default]"),
cbfe0656 »
2009-11-24 remove registry and indexkey, change output paths
23 op.make_option('--remote-port', dest='remote_port', type='int',
416a059e » davisp
2009-10-22 Refactored the external hook a bit.
24 default=5985,
b9dc7a90 »
2009-11-20 fix external hook and external documentation.
25 help="Port of the couchdb-lucene server. [%default]"),
4912c846 »
2010-01-09 fix external hook for ini changes.
26 op.make_option('--local-key', dest='key',
27 default="local",
28 help="Configured key name for this couchdb instance. [%default]"),
416a059e » davisp
2009-10-22 Refactored the external hook a bit.
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))
caccea47 »
2010-05-17 avoid JSON object encoding problem by changing multiple query feature…
37 for req in requests():
54cc92b5 »
2009-12-29 don't reuse connection as httplib has buggy persistent connection sup…
38 res = httplib.HTTPConnection(opts.remote_host, opts.remote_port)
416a059e » davisp
2009-10-22 Refactored the external hook a bit.
39 try:
caccea47 »
2010-05-17 avoid JSON object encoding problem by changing multiple query feature…
40 resp = respond(res, req, opts.key)
416a059e » davisp
2009-10-22 Refactored the external hook a bit.
41 except Exception, e:
42 body = traceback.format_exc()
43 resp = mkresp(500, body, {"Content-Type": "text/plain"})
44
54cc92b5 »
2009-12-29 don't reuse connection as httplib has buggy persistent connection sup…
45 res.close()
416a059e » davisp
2009-10-22 Refactored the external hook a bit.
46 sys.stdout.write(json.dumps(resp))
47 sys.stdout.write("\n")
48 sys.stdout.flush()
49
ef0440b7 »
2009-10-08 Python variant of couchdb external hook.
50 def requests():
51 line = sys.stdin.readline()
52 while line:
caccea47 »
2010-05-17 avoid JSON object encoding problem by changing multiple query feature…
53 yield json.loads(line)
ef0440b7 »
2009-10-08 Python variant of couchdb external hook.
54 line = sys.stdin.readline()
55
caccea47 »
2010-05-17 avoid JSON object encoding problem by changing multiple query feature…
56 def respond(res, req, key):
416a059e » davisp
2009-10-22 Refactored the external hook a bit.
57 path = req.get("path", [])
989c04a5 »
2009-11-14 make Python external hook script work for cache hits too.
58
980372a2 »
2009-12-21 tidy up python script
59 # Drop name of external hook.
60 del path[1]
18b332e0 »
2010-03-21 consolidate all servlets into one. this makes URL's more RESTful and …
61
c11d33ee »
2009-12-21 handle databases with embedded slashes
62 # URL-escape each part
63 for index, item in enumerate(path):
64 path[index] = urllib.quote(path[index], "")
980372a2 »
2009-12-21 tidy up python script
65
18b332e0 »
2010-03-21 consolidate all servlets into one. this makes URL's more RESTful and …
66 path = '/'.join(['', key] + path)
caccea47 »
2010-05-17 avoid JSON object encoding problem by changing multiple query feature…
67 params = urllib.urlencode(dict([k, v.encode('utf-8')] for k, v in req["query"].items()))
68 path = '?'.join([path, params])
24c528e0 »
2009-10-09 allow -u/--url= override for couchdb-lucene location.
69
989c04a5 »
2009-11-14 make Python external hook script work for cache hits too.
70 req_headers = {}
416a059e » davisp
2009-10-22 Refactored the external hook a bit.
71 for h in req.get("headers", []):
72 if h.lower() in ["accept", "if-none-match"]:
989c04a5 »
2009-11-14 make Python external hook script work for cache hits too.
73 req_headers[h] = req["headers"][h]
416a059e » davisp
2009-10-22 Refactored the external hook a bit.
74
f4799dc5 »
2010-01-18 handle older Python versions in hook script.
75 # verb renamed to method in 0.11 onwards.
76 if "method" in req:
77 method = req["method"]
78 else:
79 method = req["verb"]
b7c592f4 »
2010-01-31 more fixes for new _cleanup method.
80
ddfd64d0 »
2010-01-13 allow either 'verb' or 'method' in req object.
81 res.request(method, path, headers=req_headers)
416a059e » davisp
2009-10-22 Refactored the external hook a bit.
82 resp = res.getresponse()
989c04a5 »
2009-11-14 make Python external hook script work for cache hits too.
83
84 resp_headers = {}
85 for h, v in resp.getheaders():
082b7da9 »
2009-12-23 httplib lower-cases HTTP responses headers -- so fix that ourselves.
86 if h.lower() in httpdict:
87 resp_headers[httpdict[h]] = resp.getheader(h, [])
989c04a5 »
2009-11-14 make Python external hook script work for cache hits too.
88
89 return mkresp(resp.status, resp.read(), resp_headers)
416a059e » davisp
2009-10-22 Refactored the external hook a bit.
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
ef0440b7 »
2009-10-08 Python variant of couchdb external hook.
96
97 if __name__ == "__main__":
98 main()
416a059e » davisp
2009-10-22 Refactored the external hook a bit.
99
Something went wrong with that request. Please try again.