Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(464)

Unified Diff: services/mojo_url_redirector/__mojo__.py

Issue 953353002: Add HTTP handler that redirects requests for Mojo apps (Closed) Base URL: https://github.com/domokit/mojo.git@python_data_pipe_utils
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: services/mojo_url_redirector/__mojo__.py
diff --git a/services/mojo_url_redirector/__mojo__.py b/services/mojo_url_redirector/__mojo__.py
new file mode 100644
index 0000000000000000000000000000000000000000..c0b843dda3699d65df9a23b3b7f0bb4529a382d5
--- /dev/null
+++ b/services/mojo_url_redirector/__mojo__.py
@@ -0,0 +1,143 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Application that serves requests for Mojo apps and responds with redirects
+to the locations of the most recent versions of these apps."""
+
+import http_request_mojom
+import http_response_mojom
+import http_server_mojom
+import http_server_factory_mojom
+import os
qsr 2015/02/25 15:34:07 Maybe move this in its own section.
blundell 2015/02/26 13:29:52 Done.
+import net_address_mojom
+import network_service_mojom
+import service_provider_mojom
+import url_loader_mojom
+
+from mojo_application import application_delegate
+from mojo_application import application_impl
+from mojo_application import application_runner
+
+from mojo_bindings import promise
+import mojo_system
+from mojo_utils import data_pipe_utils
+
qsr 2015/02/25 15:34:07 2 blank lines.
blundell 2015/02/26 13:29:52 Done.
+class MojoUrlRedirector(http_server_mojom.HttpHandler):
+ def __init__(self, network_service):
+ self.network_service = network_service
+
+ def HandleRequest(self, request):
+ print "Handling request for", request.relative_url
+
+ # Parse the components of the request.
+ relative_url_components = request.relative_url.split("/")
+
+ # The request must have a component for the platform and for the app.
+ if len(relative_url_components) != 3:
+ response = http_response_mojom.HttpResponse()
+ response.status_code = 400
qsr 2015/02/25 15:34:07 Why isn't this a 404
blundell 2015/02/26 13:29:53 400 is "Bad Request": "The server cannot or will n
+ return response
+
+ requested_platform = relative_url_components[1]
+ requested_app = relative_url_components[2]
+
+ print "Request is for", requested_app, "on", requested_platform
+ return self.FindAppLocation(requested_platform, requested_app)
+
+ def FindAppLocation(self, requested_platform, requested_app):
+ # Construct a URLRequest to fetch the app location file...
+ app_location_request = url_loader_mojom.UrlRequest()
+ mojo_services_url = "https://storage.googleapis.com/mojo/services"
+ app_name = os.path.splitext(requested_app)[0]
qsr 2015/02/25 15:34:07 You can write this as: app_name, _ = os.path.split
blundell 2015/02/26 13:29:53 Done.
+ app_location_request.url = "%s/%s/%s_location" % (mojo_services_url,
+ requested_platform,
+ app_name)
+ app_location_request.auto_follow_redirects = True
+
+ # ...and start a URLLoader to fetch it.
+ url_loader_proxy, request = url_loader_mojom.UrlLoader.manager.NewRequest()
+ self.network_service.CreateUrlLoader(request)
+
+ # Pass the URLLoader proxy to the callback to ensure that the pipe doesn't
+ # get closed before the callback runs.
+ on_version_fetched = lambda response: self.OnFoundAppLocation(
qsr 2015/02/25 15:34:07 You might want to use functools.partial instead. Y
blundell 2015/02/26 13:29:52 Done.
+ response, requested_platform, requested_app, url_loader_proxy)
+
+ print "Calling URL Loader to start"
+ return url_loader_proxy.Start(app_location_request).Then(
+ onFullfilled=on_version_fetched)
qsr 2015/02/25 15:34:07 Do you want to have an onRejected with some loggin
blundell 2015/02/26 13:29:52 Done.
+
+ def OnFoundAppLocation(self, app_location_response, requested_platform,
+ requested_app, url_loader_proxy):
+ print "Load completed"
+
+ response = http_response_mojom.HttpResponse()
+ response.status_code = 404
qsr 2015/02/25 15:34:07 What about a function returning this, and calling
blundell 2015/02/26 13:29:52 Done.
+
+ if app_location_response.error:
+ print "Error fetching app location:", app_location_response.error
+ return response
+
+ if app_location_response.status_code != 200:
+ print "Unexpected http status in response to fetch of app location:",
+ print app_location_response.status_code
+ return response
+
+ # Read out the location of the app.
+ status, app_location = data_pipe_utils.BlockingCopyFromDataPipeIntoString(
+ app_location_response.body, 30 * 10**6)
+ print status
+ print app_location
+ if status != mojo_system.RESULT_OK:
+ print "Error reading app location:", status
+ return response
+ print "App location is", app_location
+
+ return self.RedirectToApp(requested_platform, requested_app, app_location)
+
+ def RedirectToApp(self, requested_platform, requested_app, app_location):
+ response = http_response_mojom.HttpResponse()
+ print "Redirecting to", app_location
+ response.status_code = 302
+ custom_headers = {}
+ custom_headers["location"] = app_location
+ response.custom_headers = custom_headers
+ return response
+
+
+class MojoUrlRedirectorApp(application_delegate.ApplicationDelegate):
+ def Initialize(self, shell, application):
+ server_address = net_address_mojom.NetAddress()
+ server_address.family = net_address_mojom.NetAddressFamily.IPV4
+ server_address.ipv4 = net_address_mojom.NetAddressIPv4()
+ server_address.ipv4.addr = [0, 0, 0, 0]
+ server_address.ipv4.port = 80
+
+ # Parse args if given.
+ if len(application.args) > 1:
+ assert len(application.args) == 2
+ server_address_arg = application.args[1]
+ server_address_str, server_port_str = server_address_arg.split(":")
+ server_address.ipv4.addr = [int(n) for n in server_address_str.split(".")]
+ server_address.ipv4.port = int(server_port_str)
+
+ # Connect to HttpServer.
+ http_server_factory = application.ConnectToService("mojo:http_server",
+ http_server_factory_mojom.HttpServerFactory)
+ self.http_server, request = \
+ http_server_mojom.HttpServer.manager.NewRequest()
+ http_server_factory.CreateHttpServer(request, server_address)
+
+ # Connect to NetworkService.
+ self.network_service = application.ConnectToService("mojo:network_service",
+ network_service_mojom.NetworkService)
+
+ # Construct a MojoUrlRedirector and add that as a handler to the server.
+ self.app_request_handler = MojoUrlRedirector(self.network_service)
+ self.http_server.SetHandler("/.*", self.app_request_handler)
+
+
+def MojoMain(app_request_handle):
+ application_runner.RunMojoApplication(MojoUrlRedirectorApp(),
+ app_request_handle)
« services/mojo_url_redirector/BUILD.gn ('K') | « services/mojo_url_redirector/BUILD.gn ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698