15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_BROWSER_RENDERER_HOST_SOCKET_STREAM_DISPATCHER_HOST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_RENDERER_HOST_SOCKET_STREAM_DISPATCHER_HOST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/callback_forward.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/id_map.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/ssl/ssl_error_handler.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_message_filter.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket_stream/socket_stream.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLInfo;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceContext;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketStreamHost;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dispatches ViewHostMsg_SocketStream_* messages sent from renderer.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It also acts as SocketStream::Delegate so that it sends
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ViewMsg_SocketStream_* messages back to renderer.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketStreamDispatcherHost
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public BrowserMessageFilter,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public net::SocketStream::Delegate,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public SSLErrorHandler::Delegate {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef base::Callback<net::URLRequestContext*(ResourceType)>
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GetRequestContextCallback;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketStreamDispatcherHost(
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int render_process_id,
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const GetRequestContextCallback& request_context_callback,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceContext* resource_context);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowserMessageFilter:
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Make this object inactive.
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Remove all active SocketStreamHost objects.
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void Shutdown();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SocketStream::Delegate:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnConnected(net::SocketStream* socket,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int max_pending_send_allowed) OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSentData(net::SocketStream* socket, int amount_sent) OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnReceivedData(net::SocketStream* socket,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const char* data, int len) OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnClose(net::SocketStream* socket) OVERRIDE;
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnError(const net::SocketStream* socket, int error) OVERRIDE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSSLCertificateError(net::SocketStream* socket,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const net::SSLInfo& ssl_info,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     bool fatal) OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CanGetCookies(net::SocketStream* socket,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const GURL& url) OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CanSetCookie(net::SocketStream* request,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const GURL& url,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& cookie_line,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            net::CookieOptions* options) OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SSLErrorHandler::Delegate methods:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CancelSSLRequest(const GlobalRequestID& id,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int error,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const net::SSLInfo* ssl_info) OVERRIDE;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ContinueSSLRequest(const GlobalRequestID& id) OVERRIDE;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketStreamDispatcherHost();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message handlers called by OnMessageReceived.
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnConnect(int render_frame_id, const GURL& url, int socket_id);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSendData(int socket_id, const std::vector<char>& data);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCloseReq(int socket_id);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteSocketStreamHost(int socket_id);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequestContext* GetURLRequestContext();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDMap<SocketStreamHost> hosts_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_process_id_;
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetRequestContextCallback request_context_callback_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceContext* resource_context_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool on_shutdown_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WeakPtrFactory<SocketStreamDispatcherHost> weak_ptr_factory_;
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SocketStreamDispatcherHost);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_BROWSER_RENDERER_HOST_SOCKET_STREAM_DISPATCHER_HOST_H_
101