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

Subscribers

People subscribed via source and target branches