diff --git a/moto/core/responses.py b/moto/core/responses.py index a39795577..4a0515c4b 100644 --- a/moto/core/responses.py +++ b/moto/core/responses.py @@ -26,7 +26,7 @@ class BaseResponse(object): for key, value in request.form.iteritems(): querystring[key] = [value, ] - if querystring is None: + if not querystring: querystring.update(parse_qs(urlparse(full_url).query)) if not querystring: querystring.update(parse_qs(self.body)) diff --git a/moto/server.py b/moto/server.py index 6209d12c3..a063bbf77 100644 --- a/moto/server.py +++ b/moto/server.py @@ -20,12 +20,16 @@ class DomainDispatcherApplication(object): value. We'll match the host header value with the url_bases of each backend. """ - def __init__(self, create_app): + def __init__(self, create_app, service=None): self.create_app = create_app self.lock = Lock() self.app_instances = {} + self.service = service def get_backend_for_host(self, host): + if self.service: + return BACKENDS[self.service] + for backend in BACKENDS.itervalues(): for url_base in backend.url_bases: if re.match(url_base, 'http://%s' % host): @@ -55,7 +59,7 @@ class RegexConverter(BaseConverter): self.regex = items[0] -def create_backend_app(backend): +def create_backend_app(service): from werkzeug.routing import Map # Create the backend_app @@ -66,6 +70,8 @@ def create_backend_app(backend): backend_app.view_functions = {} backend_app.url_map = Map() backend_app.url_map.converters['regex'] = RegexConverter + + backend = BACKENDS[service] for url_path, handler in backend.flask_paths.iteritems(): backend_app.route(url_path, methods=HTTP_METHODS)(convert_flask_to_httpretty_response(handler)) @@ -74,6 +80,9 @@ def create_backend_app(backend): def main(argv=sys.argv[1:]): parser = argparse.ArgumentParser() + + # Keep this for backwards compat + parser.add_argument("service", type=str) parser.add_argument( '-H', '--host', type=str, help='Which host to bind', @@ -86,7 +95,7 @@ def main(argv=sys.argv[1:]): args = parser.parse_args(argv) # Wrap the main application - main_app = DomainDispatcherApplication(create_backend_app) + main_app = DomainDispatcherApplication(create_backend_app, service=args.service) main_app.debug = True run_simple(args.host, args.port, main_app) diff --git a/moto/sqs/urls.py b/moto/sqs/urls.py index 7e3614866..bbc6a2733 100644 --- a/moto/sqs/urls.py +++ b/moto/sqs/urls.py @@ -1,7 +1,7 @@ from .responses import QueueResponse, QueuesResponse url_bases = [ - "https?://queue(.*).amazonaws.com" + "https?://(.*?)(queue|sqs)(.*?).amazonaws.com" ] url_paths = { diff --git a/tests/test_autoscaling/test_server.py b/tests/test_autoscaling/test_server.py index d3ca05cd5..72a38750d 100644 --- a/tests/test_autoscaling/test_server.py +++ b/tests/test_autoscaling/test_server.py @@ -5,11 +5,12 @@ import moto.server as server ''' Test the different server responses ''' -server.configure_urls("autoscaling") def test_describe_autoscaling_groups(): - test_client = server.app.test_client() + backend = server.create_backend_app("autoscaling") + test_client = backend.test_client() + res = test_client.get('/?Action=DescribeLaunchConfigurations') res.data.should.contain('(.*)", res.data) diff --git a/tests/test_elb/test_server.py b/tests/test_elb/test_server.py index 9fc172dd6..c8f13e8d0 100644 --- a/tests/test_elb/test_server.py +++ b/tests/test_elb/test_server.py @@ -5,11 +5,12 @@ import moto.server as server ''' Test the different server responses ''' -server.configure_urls("elb") def test_elb_describe_instances(): - test_client = server.app.test_client() + backend = server.create_backend_app("elb") + test_client = backend.test_client() + res = test_client.get('/?Action=DescribeLoadBalancers') res.data.should.contain('DescribeLoadBalancersResponse') diff --git a/tests/test_emr/test_server.py b/tests/test_emr/test_server.py index 85ba7c4db..07aed3bc5 100644 --- a/tests/test_emr/test_server.py +++ b/tests/test_emr/test_server.py @@ -5,11 +5,12 @@ import moto.server as server ''' Test the different server responses ''' -server.configure_urls("emr") def test_describe_jobflows(): - test_client = server.app.test_client() + backend = server.create_backend_app("emr") + test_client = backend.test_client() + res = test_client.get('/?Action=DescribeJobFlows') res.data.should.contain('') diff --git a/tests/test_s3/test_server.py b/tests/test_s3/test_server.py index d2f38cb07..ee1429819 100644 --- a/tests/test_s3/test_server.py +++ b/tests/test_s3/test_server.py @@ -5,18 +5,21 @@ import moto.server as server ''' Test the different server responses ''' -server.configure_urls("s3") def test_s3_server_get(): - test_client = server.app.test_client() + backend = server.create_backend_app("s3") + test_client = backend.test_client() + res = test_client.get('/') res.data.should.contain('ListAllMyBucketsResult') def test_s3_server_bucket_create(): - test_client = server.app.test_client() + backend = server.create_backend_app("s3") + test_client = backend.test_client() + res = test_client.put('/', 'http://foobar.localhost:5000/') res.status_code.should.equal(200) @@ -36,7 +39,9 @@ def test_s3_server_bucket_create(): def test_s3_server_post_to_bucket(): - test_client = server.app.test_client() + backend = server.create_backend_app("s3") + test_client = backend.test_client() + res = test_client.put('/', 'http://foobar.localhost:5000/') res.status_code.should.equal(200) diff --git a/tests/test_s3bucket_path/test_bucket_path_server.py b/tests/test_s3bucket_path/test_bucket_path_server.py index 943615767..b8eea77e1 100644 --- a/tests/test_s3bucket_path/test_bucket_path_server.py +++ b/tests/test_s3bucket_path/test_bucket_path_server.py @@ -5,18 +5,21 @@ import moto.server as server ''' Test the different server responses ''' -server.configure_urls("s3bucket_path") def test_s3_server_get(): - test_client = server.app.test_client() + backend = server.create_backend_app("s3bucket_path") + test_client = backend.test_client() + res = test_client.get('/') res.data.should.contain('ListAllMyBucketsResult') def test_s3_server_bucket_create(): - test_client = server.app.test_client() + backend = server.create_backend_app("s3bucket_path") + test_client = backend.test_client() + res = test_client.put('/foobar', 'http://localhost:5000') res.status_code.should.equal(200) @@ -36,7 +39,9 @@ def test_s3_server_bucket_create(): def test_s3_server_post_to_bucket(): - test_client = server.app.test_client() + backend = server.create_backend_app("s3bucket_path") + test_client = backend.test_client() + res = test_client.put('/foobar', 'http://localhost:5000/') res.status_code.should.equal(200) diff --git a/tests/test_ses/test_server.py b/tests/test_ses/test_server.py index 876fa1240..06a71d137 100644 --- a/tests/test_ses/test_server.py +++ b/tests/test_ses/test_server.py @@ -5,10 +5,11 @@ import moto.server as server ''' Test the different server responses ''' -server.configure_urls("ses") def test_ses_list_identities(): - test_client = server.app.test_client() + backend = server.create_backend_app("ses") + test_client = backend.test_client() + res = test_client.get('/?Action=ListIdentities') res.data.should.contain("ListIdentitiesResponse") diff --git a/tests/test_sqs/test_server.py b/tests/test_sqs/test_server.py index 8934dcecc..4e5102edf 100644 --- a/tests/test_sqs/test_server.py +++ b/tests/test_sqs/test_server.py @@ -6,11 +6,12 @@ import moto.server as server ''' Test the different server responses ''' -server.configure_urls("sqs") def test_sqs_list_identities(): - test_client = server.app.test_client() + backend = server.create_backend_app("sqs") + test_client = backend.test_client() + res = test_client.get('/?Action=ListQueues') res.data.should.contain("ListQueuesResponse") diff --git a/tests/test_sts/test_server.py b/tests/test_sts/test_server.py index 9a505422f..a1f428caf 100644 --- a/tests/test_sts/test_server.py +++ b/tests/test_sts/test_server.py @@ -5,11 +5,12 @@ import moto.server as server ''' Test the different server responses ''' -server.configure_urls("sts") def test_sts_get_session_token(): - test_client = server.app.test_client() + backend = server.create_backend_app("sts") + test_client = backend.test_client() + res = test_client.get('/?Action=GetSessionToken') res.status_code.should.equal(200) res.data.should.contain("SessionToken")