| // Copyright (c) 2012 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. | |
| #ifndef NET_DIAL_DIAL_HTTP_SERVER_H | |
| #define NET_DIAL_DIAL_HTTP_SERVER_H | |
| #include <string> | |
| #include "base/callback_forward.h" | |
| #include "base/memory/ref_counted.h" | |
| #include "base/single_thread_task_runner.h" | |
| #include "net/dial/dial_service_handler.h" | |
| #include "net/http/http_status_code.h" | |
| #include "net/server/http_server.h" | |
| #include "net/server/http_server_response_info.h" | |
| namespace net { | |
| class DialService; | |
| class HttpResponseInfo; | |
| class IPEndPoint; | |
| // This class is created and owned by DialService and is not meant to be | |
| // used externally. | |
| // All functions run on the DialService's message loop, except for | |
| // the callback AsyncReceivedResponse() which is eventually called | |
| // by a DialServiceHandler. | |
| // It's refcounted threadsafe so we can safely bind it to the callback we pass | |
| // to DialServiceHandler::handleRequest(). | |
| class NET_EXPORT DialHttpServer | |
| : public HttpServer::Delegate, | |
| public base::RefCountedThreadSafe<DialHttpServer> { | |
| public: | |
| explicit DialHttpServer(DialService* dial_service); | |
| void Stop(); | |
| // HttpServer::Delegate implementation | |
| virtual void OnConnect(int /*conn_id*/) override{}; | |
| virtual void OnHttpRequest(int conn_id, | |
| const HttpServerRequestInfo& info) override; | |
| virtual void OnClose(int conn_id) override; | |
| // Unused HttpServer::Delegate | |
| virtual void OnWebSocketRequest( | |
| int /*connection_id*/, | |
| const HttpServerRequestInfo& /*info*/) override {} | |
| virtual void OnWebSocketMessage(int /*connection_id*/, | |
| const std::string& /*data*/) override {} | |
| // Return the formatted application URL | |
| std::string application_url() const { return server_url_ + "apps/"; } | |
| // Return the formatted location URL. | |
| std::string location_url() const { return server_url_ + "dd.xml"; } | |
| // Somewhat similar to HttpServer::GetLocalAddress, but figures out the | |
| // network IP address and uses that. The port remains the same. | |
| int GetLocalAddress(IPEndPoint* addr); | |
| private: | |
| friend class base::RefCountedThreadSafe<DialHttpServer>; | |
| virtual ~DialHttpServer(); | |
| void ConfigureApplicationUrl(); | |
| // Send the DIAL Device Description Manifest to the client. | |
| void SendDeviceDescriptionManifest(int conn_id); | |
| // Query DIAL service for a handler for the given request. | |
| // Return false if no handler found, true if handleRequest() was issued | |
| // to the handler. | |
| bool DispatchToHandler(int conn_id, const HttpServerRequestInfo& info); | |
| // Callback from WebKit thread when the HTTP task is complete. | |
| // Post the response info to DIAL service thread. | |
| void AsyncReceivedResponse(int conn_id, | |
| std::unique_ptr<HttpServerResponseInfo> response); | |
| // Handles DIAL response. | |
| void OnReceivedResponse(int conn_id, | |
| std::unique_ptr<HttpServerResponseInfo> response); | |
| std::unique_ptr<HttpServer> http_server_; | |
| std::string server_url_; | |
| // DialService owns this object. | |
| DialService* dial_service_; | |
| // Message Loop of the thread that created us. We make sure http server | |
| // is only called on the proper thread. | |
| scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | |
| DISALLOW_COPY_AND_ASSIGN(DialHttpServer); | |
| }; | |
| } // namespace net | |
| #endif // NET_DIAL_DIAL_HTTP_SERVER_H |