Merge lp:~pedronis/u1db/u1db-serve-w-cors into lp:u1db

Proposed by Samuele Pedroni
Status: Merged
Approved by: Samuele Pedroni
Approved revision: 428
Merged at revision: 428
Proposed branch: lp:~pedronis/u1db/u1db-serve-w-cors
Merge into: lp:u1db
Diff against target: 134 lines (+50/-26)
3 files modified
u1db-serve (+8/-1)
u1db/commandline/serve.py (+5/-1)
u1db/tests/commandline/test_serve.py (+37/-24)
To merge this branch: bzr merge lp:~pedronis/u1db/u1db-serve-w-cors
Reviewer Review Type Date Requested Status
Stuart Langridge (community) Approve
Review via email: mp+129177@code.launchpad.net

Commit message

add support for serving CORS headers to u1db-serve

Description of the change

add support for serving CORS headers to u1db-serve

To post a comment you must log in.
Revision history for this message
Stuart Langridge (sil) wrote :

Seems to be adding headers properly. It might be worth mentioning in the help that you need to quote a "*" otherwise it gets interpreted by the shell ;)

review: Approve
lp:~pedronis/u1db/u1db-serve-w-cors updated
428. By Samuele Pedroni

clarify help

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'u1db-serve'
2--- u1db-serve 2011-12-21 19:33:35 +0000
3+++ u1db-serve 2012-10-12 10:25:22 +0000
4@@ -37,9 +37,16 @@
5 help='Bind to this port when serving.')
6 p.add_argument('--working-dir', default='.', metavar='WORKING_DIR',
7 help='Directory where the databases live.')
8+ p.add_argument('--accept-cors-connections', default=None,
9+ metavar="ACCEPTED_ORIGINS",
10+ help='Comma separated accepted origins or "*"')
11
12 args = p.parse_args(args)
13- server = serve.make_server(args.host, args.port, args.working_dir)
14+ accept_cors_connections = args.accept_cors_connections
15+ if accept_cors_connections is not None:
16+ accept_cors_connections = accept_cors_connections.split(',')
17+ server = serve.make_server(args.host, args.port, args.working_dir,
18+ accept_cors_connections)
19 sys.stdout.write('listening on: %s:%s\n' % server.server_address)
20 sys.stdout.flush()
21 server.serve_forever()
22
23=== modified file 'u1db/commandline/serve.py'
24--- u1db/commandline/serve.py 2011-12-21 19:33:35 +0000
25+++ u1db/commandline/serve.py 2012-10-12 10:25:22 +0000
26@@ -21,14 +21,18 @@
27 from u1db.remote import (
28 http_app,
29 server_state,
30+ cors_middleware
31 )
32
33
34-def make_server(host, port, working_dir):
35+def make_server(host, port, working_dir, accept_cors_connections=None):
36 """Make a server on host and port exposing dbs living in working_dir."""
37 state = server_state.ServerState()
38 state.set_workingdir(working_dir)
39 application = http_app.HTTPApp(state)
40+ if accept_cors_connections:
41+ application = cors_middleware.CORSMiddleware(application,
42+ accept_cors_connections)
43 server = httpserver.WSGIServer(application, (host, port),
44 httpserver.WSGIHandler)
45 return server
46
47=== modified file 'u1db/tests/commandline/test_serve.py'
48--- u1db/tests/commandline/test_serve.py 2012-04-20 14:57:30 +0000
49+++ u1db/tests/commandline/test_serve.py 2012-10-12 10:25:22 +0000
50@@ -53,16 +53,21 @@
51 self.assertEqual(0, p.returncode)
52 self.assertIn('Run the U1DB server', stdout)
53
54+ def _get_port(self, p, starts='listening on:'):
55+ x = p.stdout.readline().strip()
56+ self.assertTrue(x.startswith(starts))
57+ return int(x[len(starts):].split(":")[1])
58+
59+ def _request(self, port, path):
60+ url = "http://127.0.0.1:%s%s" % (port, path)
61+ c = http_client.HTTPClientBase(url)
62+ self.addCleanup(c.close)
63+ return c._request_json('GET', [])
64+
65 def test_bind_to_port(self):
66 p = self.startU1DBServe([])
67- starts = 'listening on:'
68- x = p.stdout.readline()
69- self.assertTrue(x.startswith(starts))
70- port = int(x[len(starts):].split(":")[1])
71- url = "http://127.0.0.1:%s/" % port
72- c = http_client.HTTPClientBase(url)
73- self.addCleanup(c.close)
74- res, _ = c._request_json('GET', [])
75+ port = self._get_port(p)
76+ res, _ = self._request(port, '/')
77 self.assertEqual({'version': _u1db_version}, res)
78
79 def test_supply_port(self):
80@@ -71,12 +76,9 @@
81 host, port = s.getsockname()
82 s.close()
83 p = self.startU1DBServe(['--port', str(port)])
84- x = p.stdout.readline().strip()
85- self.assertEqual('listening on: 127.0.0.1:%s' % (port,), x)
86- url = "http://127.0.0.1:%s/" % port
87- c = http_client.HTTPClientBase(url)
88- self.addCleanup(c.close)
89- res, _ = c._request_json('GET', [])
90+ eff_port = self._get_port(p, 'listening on: 127.0.0.1')
91+ self.assertEqual(port, eff_port)
92+ res, _ = self._request(port, '/')
93 self.assertEqual({'version': _u1db_version}, res)
94
95 def test_bind_to_host(self):
96@@ -85,17 +87,28 @@
97 x = p.stdout.readline()
98 self.assertTrue(x.startswith(starts))
99
100- def test_supply_working_dir(self):
101+ def _landmark_db(self, name):
102 tmp_dir = self.createTempDir('u1db-serve-test')
103- db = u1db_open(os.path.join(tmp_dir, 'landmark.db'), create=True)
104+ db = u1db_open(os.path.join(tmp_dir, name), create=True)
105 db.close()
106+ return tmp_dir
107+
108+ def test_supply_working_dir(self):
109+ tmp_dir = self._landmark_db('landmark.db')
110 p = self.startU1DBServe(['--working-dir', tmp_dir])
111- starts = 'listening on:'
112- x = p.stdout.readline()
113- self.assertTrue(x.startswith(starts))
114- port = int(x[len(starts):].split(":")[1])
115- url = "http://127.0.0.1:%s/landmark.db" % port
116- c = http_client.HTTPClientBase(url)
117- self.addCleanup(c.close)
118- res, _ = c._request_json('GET', [])
119+ port = self._get_port(p)
120+ res, _ = self._request(port, '/landmark.db')
121 self.assertEqual({}, res)
122+
123+ def test_accept_cors_connections(self):
124+ tmp_dir = self._landmark_db('landmark2.db')
125+ origins = ['http://bar.example', 'http://foo.example']
126+ p = self.startU1DBServe(['--working-dir', tmp_dir,
127+ '--accept-cors-connections',
128+ ','.join(origins)])
129+ port = self._get_port(p)
130+ res, headers = self._request(port, '/landmark2.db')
131+ self.assertEqual({}, res) # sanity
132+ self.assertIn('access-control-allow-origin', headers)
133+ self.assertEqual(' '.join(origins),
134+ headers['access-control-allow-origin'])

Subscribers

People subscribed via source and target branches