socket_stream_host.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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 "net/socket_stream/socket_stream_job.h"
10#include "net/url_request/url_request_context.h"
11
12namespace content {
13namespace {
14
15const char* kSocketIdKey = "socketId";
16
17class SocketStreamId : public net::SocketStream::UserData {
18 public:
19  explicit SocketStreamId(int socket_id) : socket_id_(socket_id) {}
20  virtual ~SocketStreamId() {}
21  int socket_id() const { return socket_id_; }
22
23 private:
24  int socket_id_;
25};
26
27}  // namespace
28
29SocketStreamHost::SocketStreamHost(
30    net::SocketStream::Delegate* delegate,
31    int render_view_id,
32    int socket_id)
33    : delegate_(delegate),
34      render_view_id_(render_view_id),
35      socket_id_(socket_id) {
36  DCHECK_NE(socket_id_, kNoSocketId);
37  VLOG(1) << "SocketStreamHost: render_view_id=" << render_view_id
38          << " socket_id=" << socket_id_;
39}
40
41/* static */
42int SocketStreamHost::SocketIdFromSocketStream(
43    const net::SocketStream* socket) {
44  net::SocketStream::UserData* d = socket->GetUserData(kSocketIdKey);
45  if (d) {
46    SocketStreamId* socket_stream_id = static_cast<SocketStreamId*>(d);
47    return socket_stream_id->socket_id();
48  }
49  return kNoSocketId;
50}
51
52SocketStreamHost::~SocketStreamHost() {
53  VLOG(1) << "SocketStreamHost destructed socket_id=" << socket_id_;
54  socket_->DetachDelegate();
55}
56
57void SocketStreamHost::Connect(const GURL& url,
58                               net::URLRequestContext* request_context) {
59  VLOG(1) << "SocketStreamHost::Connect url=" << url;
60  socket_ = net::SocketStreamJob::CreateSocketStreamJob(
61      url, delegate_, request_context->transport_security_state(),
62      request_context->ssl_config_service());
63  socket_->set_context(request_context);
64  socket_->SetUserData(kSocketIdKey, new SocketStreamId(socket_id_));
65  socket_->Connect();
66}
67
68bool SocketStreamHost::SendData(const std::vector<char>& data) {
69  VLOG(1) << "SocketStreamHost::SendData";
70  return socket_ && socket_->SendData(&data[0], data.size());
71}
72
73void SocketStreamHost::Close() {
74  VLOG(1) << "SocketStreamHost::Close";
75  if (!socket_)
76    return;
77  socket_->Close();
78}
79
80void SocketStreamHost::CancelWithError(int error) {
81  VLOG(1) << "SocketStreamHost::CancelWithError: error=" << error;
82  if (!socket_)
83    return;
84  socket_->CancelWithError(error);
85}
86
87void SocketStreamHost::CancelWithSSLError(const net::SSLInfo& ssl_info) {
88  VLOG(1) << "SocketStreamHost::CancelWithSSLError";
89  if (!socket_)
90    return;
91  socket_->CancelWithSSLError(ssl_info);
92}
93
94void SocketStreamHost::ContinueDespiteError() {
95  VLOG(1) << "SocketStreamHost::ContinueDespiteError";
96  if (!socket_)
97    return;
98  socket_->ContinueDespiteError();
99}
100
101}  // namespace content
102