1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/browser/renderer_host/socket_stream_host.h" 6 7#include "base/logging.h" 8#include "content/common/socket_stream.h" 9#include "content/public/browser/content_browser_client.h" 10#include "net/socket_stream/socket_stream_job.h" 11#include "net/url_request/url_request_context.h" 12 13namespace content { 14namespace { 15 16const char* kSocketIdKey = "socketId"; 17 18class SocketStreamId : public net::SocketStream::UserData { 19 public: 20 explicit SocketStreamId(int socket_id) : socket_id_(socket_id) {} 21 virtual ~SocketStreamId() {} 22 int socket_id() const { return socket_id_; } 23 24 private: 25 int socket_id_; 26}; 27 28} // namespace 29 30SocketStreamHost::SocketStreamHost( 31 net::SocketStream::Delegate* delegate, 32 int child_id, 33 int render_frame_id, 34 int socket_id) 35 : delegate_(delegate), 36 child_id_(child_id), 37 render_frame_id_(render_frame_id), 38 socket_id_(socket_id) { 39 DCHECK_NE(socket_id_, kNoSocketId); 40 VLOG(1) << "SocketStreamHost: render_frame_id=" << render_frame_id 41 << " socket_id=" << socket_id_; 42} 43 44/* static */ 45int SocketStreamHost::SocketIdFromSocketStream( 46 const net::SocketStream* socket) { 47 net::SocketStream::UserData* d = socket->GetUserData(kSocketIdKey); 48 if (d) { 49 SocketStreamId* socket_stream_id = static_cast<SocketStreamId*>(d); 50 return socket_stream_id->socket_id(); 51 } 52 return kNoSocketId; 53} 54 55SocketStreamHost::~SocketStreamHost() { 56 VLOG(1) << "SocketStreamHost destructed socket_id=" << socket_id_; 57 job_->DetachContext(); 58 job_->DetachDelegate(); 59} 60 61void SocketStreamHost::Connect(const GURL& url, 62 net::URLRequestContext* request_context) { 63 VLOG(1) << "SocketStreamHost::Connect url=" << url; 64 job_ = net::SocketStreamJob::CreateSocketStreamJob( 65 url, delegate_, request_context->transport_security_state(), 66 request_context->ssl_config_service(), 67 request_context, 68 GetContentClient()->browser()->OverrideCookieStoreForRenderProcess( 69 child_id_)); 70 job_->SetUserData(kSocketIdKey, new SocketStreamId(socket_id_)); 71 job_->Connect(); 72} 73 74bool SocketStreamHost::SendData(const std::vector<char>& data) { 75 VLOG(1) << "SocketStreamHost::SendData"; 76 return job_.get() && job_->SendData(&data[0], data.size()); 77} 78 79void SocketStreamHost::Close() { 80 VLOG(1) << "SocketStreamHost::Close"; 81 if (!job_.get()) 82 return; 83 job_->Close(); 84} 85 86void SocketStreamHost::CancelWithError(int error) { 87 VLOG(1) << "SocketStreamHost::CancelWithError: error=" << error; 88 if (!job_.get()) 89 return; 90 job_->CancelWithError(error); 91} 92 93void SocketStreamHost::CancelWithSSLError(const net::SSLInfo& ssl_info) { 94 VLOG(1) << "SocketStreamHost::CancelWithSSLError"; 95 if (!job_.get()) 96 return; 97 job_->CancelWithSSLError(ssl_info); 98} 99 100void SocketStreamHost::ContinueDespiteError() { 101 VLOG(1) << "SocketStreamHost::ContinueDespiteError"; 102 if (!job_.get()) 103 return; 104 job_->ContinueDespiteError(); 105} 106 107} // namespace content 108