| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "mojo/services/network/http_connection_impl.h" | 5 #include "mojo/services/network/http_connection_impl.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 void OnHandleReady(MojoResult result) { ReadMore(); } | 78 void OnHandleReady(MojoResult result) { ReadMore(); } |
| 79 | 79 |
| 80 ScopedDataPipeConsumerHandle consumer_; | 80 ScopedDataPipeConsumerHandle consumer_; |
| 81 common::HandleWatcher watcher_; | 81 common::HandleWatcher watcher_; |
| 82 CompletionCallback completion_callback_; | 82 CompletionCallback completion_callback_; |
| 83 scoped_ptr<std::string> buffer_; | 83 scoped_ptr<std::string> buffer_; |
| 84 | 84 |
| 85 DISALLOW_COPY_AND_ASSIGN(SimpleDataPipeReader); | 85 DISALLOW_COPY_AND_ASSIGN(SimpleDataPipeReader); |
| 86 }; | 86 }; |
| 87 | 87 |
| 88 class HttpConnectionImpl::WebSocketImpl : public WebSocket, | 88 class HttpConnectionImpl::WebSocketImpl : public WebSocket { |
| 89 public ErrorHandler { | |
| 90 public: | 89 public: |
| 91 // |connection| must outlive this object. | 90 // |connection| must outlive this object. |
| 92 WebSocketImpl(HttpConnectionImpl* connection, | 91 WebSocketImpl(HttpConnectionImpl* connection, |
| 93 InterfaceRequest<WebSocket> request, | 92 InterfaceRequest<WebSocket> request, |
| 94 ScopedDataPipeConsumerHandle send_stream, | 93 ScopedDataPipeConsumerHandle send_stream, |
| 95 WebSocketClientPtr client) | 94 WebSocketClientPtr client) |
| 96 : connection_(connection), | 95 : connection_(connection), |
| 97 binding_(this, request.Pass()), | 96 binding_(this, request.Pass()), |
| 98 client_(client.Pass()), | 97 client_(client.Pass()), |
| 99 send_stream_(send_stream.Pass()), | 98 send_stream_(send_stream.Pass()), |
| 100 read_send_stream_(new WebSocketReadQueue(send_stream_.get())), | 99 read_send_stream_(new WebSocketReadQueue(send_stream_.get())), |
| 101 pending_send_count_(0) { | 100 pending_send_count_(0) { |
| 102 DCHECK(binding_.is_bound()); | 101 DCHECK(binding_.is_bound()); |
| 103 DCHECK(client_); | 102 DCHECK(client_); |
| 104 DCHECK(send_stream_.is_valid()); | 103 DCHECK(send_stream_.is_valid()); |
| 105 | 104 |
| 106 binding_.set_error_handler(this); | 105 binding_.set_connection_error_handler([this]() { Close(); }); |
| 107 client_.set_error_handler(this); | 106 client_.set_connection_error_handler([this]() { Close(); }); |
| 108 | 107 |
| 109 DataPipe data_pipe; | 108 DataPipe data_pipe; |
| 110 receive_stream_ = data_pipe.producer_handle.Pass(); | 109 receive_stream_ = data_pipe.producer_handle.Pass(); |
| 111 write_receive_stream_.reset(new WebSocketWriteQueue(receive_stream_.get())); | 110 write_receive_stream_.reset(new WebSocketWriteQueue(receive_stream_.get())); |
| 112 | 111 |
| 113 client_->DidConnect("", "", data_pipe.consumer_handle.Pass()); | 112 client_->DidConnect("", "", data_pipe.consumer_handle.Pass()); |
| 114 } | 113 } |
| 115 | 114 |
| 116 ~WebSocketImpl() override {} | 115 ~WebSocketImpl() override {} |
| 117 | 116 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 num_bytes, base::Bind(&WebSocketImpl::OnFinishedReadingSendStream, | 165 num_bytes, base::Bind(&WebSocketImpl::OnFinishedReadingSendStream, |
| 167 base::Unretained(this), num_bytes)); | 166 base::Unretained(this), num_bytes)); |
| 168 } | 167 } |
| 169 | 168 |
| 170 void FlowControl(int64_t quota) override { NOTIMPLEMENTED(); } | 169 void FlowControl(int64_t quota) override { NOTIMPLEMENTED(); } |
| 171 | 170 |
| 172 void Close(uint16_t code, const String& reason) override { | 171 void Close(uint16_t code, const String& reason) override { |
| 173 Close(); | 172 Close(); |
| 174 } | 173 } |
| 175 | 174 |
| 176 // ErrorHandler implementation. | |
| 177 void OnConnectionError() override { Close(); } | |
| 178 | |
| 179 void OnFinishedReadingSendStream(uint32_t num_bytes, const char* data) { | 175 void OnFinishedReadingSendStream(uint32_t num_bytes, const char* data) { |
| 180 DCHECK_GT(pending_send_count_, 0u); | 176 DCHECK_GT(pending_send_count_, 0u); |
| 181 pending_send_count_--; | 177 pending_send_count_--; |
| 182 | 178 |
| 183 if (data) { | 179 if (data) { |
| 184 connection_->server_->server()->SendOverWebSocket( | 180 connection_->server_->server()->SendOverWebSocket( |
| 185 connection_->connection_id_, std::string(data, num_bytes)); | 181 connection_->connection_id_, std::string(data, num_bytes)); |
| 186 } | 182 } |
| 187 | 183 |
| 188 if (IsClosing()) | 184 if (IsClosing()) |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 | 252 |
| 257 HttpConnectionImpl::HttpConnectionImpl(int connection_id, | 253 HttpConnectionImpl::HttpConnectionImpl(int connection_id, |
| 258 HttpServerImpl* server, | 254 HttpServerImpl* server, |
| 259 HttpConnectionDelegatePtr delegate, | 255 HttpConnectionDelegatePtr delegate, |
| 260 HttpConnectionPtr* connection) | 256 HttpConnectionPtr* connection) |
| 261 : connection_id_(connection_id), | 257 : connection_id_(connection_id), |
| 262 server_(server), | 258 server_(server), |
| 263 delegate_(delegate.Pass()), | 259 delegate_(delegate.Pass()), |
| 264 binding_(this, connection) { | 260 binding_(this, connection) { |
| 265 DCHECK(delegate_); | 261 DCHECK(delegate_); |
| 266 binding_.set_error_handler(this); | 262 binding_.set_connection_error_handler([this]() { Close(); }); |
| 267 delegate_.set_error_handler(this); | 263 delegate_.set_connection_error_handler([this]() { Close(); }); |
| 268 } | 264 } |
| 269 | 265 |
| 270 HttpConnectionImpl::~HttpConnectionImpl() { | 266 HttpConnectionImpl::~HttpConnectionImpl() { |
| 271 STLDeleteElements(&response_body_readers_); | 267 STLDeleteElements(&response_body_readers_); |
| 272 } | 268 } |
| 273 | 269 |
| 274 void HttpConnectionImpl::OnReceivedHttpRequest( | 270 void HttpConnectionImpl::OnReceivedHttpRequest( |
| 275 const net::HttpServerRequestInfo& info) { | 271 const net::HttpServerRequestInfo& info) { |
| 276 if (IsClosing()) | 272 if (IsClosing()) |
| 277 return; | 273 return; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 uint32_t size, | 333 uint32_t size, |
| 338 const SetReceiveBufferSizeCallback& callback) { | 334 const SetReceiveBufferSizeCallback& callback) { |
| 339 if (size > static_cast<uint32_t>(std::numeric_limits<int32_t>::max())) | 335 if (size > static_cast<uint32_t>(std::numeric_limits<int32_t>::max())) |
| 340 size = std::numeric_limits<int32_t>::max(); | 336 size = std::numeric_limits<int32_t>::max(); |
| 341 | 337 |
| 342 server_->server()->SetReceiveBufferSize(connection_id_, | 338 server_->server()->SetReceiveBufferSize(connection_id_, |
| 343 static_cast<int32_t>(size)); | 339 static_cast<int32_t>(size)); |
| 344 callback.Run(MakeNetworkError(net::OK)); | 340 callback.Run(MakeNetworkError(net::OK)); |
| 345 } | 341 } |
| 346 | 342 |
| 347 void HttpConnectionImpl::OnConnectionError() { | |
| 348 // This method is called when the proxy side of |binding_| or the impl side of | |
| 349 // |delegate_| has closed the pipe. Although it is set as error handler for | |
| 350 // both |binding_| and |delegate_|, it will only be called at most once | |
| 351 // because when called it closes/resets |binding_| and |delegate_|. | |
| 352 Close(); | |
| 353 } | |
| 354 | |
| 355 void HttpConnectionImpl::OnFinishedReadingResponseBody( | 343 void HttpConnectionImpl::OnFinishedReadingResponseBody( |
| 356 HttpResponsePtr response, | 344 HttpResponsePtr response, |
| 357 SimpleDataPipeReader* reader, | 345 SimpleDataPipeReader* reader, |
| 358 scoped_ptr<std::string> body) { | 346 scoped_ptr<std::string> body) { |
| 359 if (reader) { | 347 if (reader) { |
| 360 delete reader; | 348 delete reader; |
| 361 response_body_readers_.erase(reader); | 349 response_body_readers_.erase(reader); |
| 362 } | 350 } |
| 363 | 351 |
| 364 net::HttpServerResponseInfo info( | 352 net::HttpServerResponseInfo info( |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 // The close operation is initiated by this object. | 411 // The close operation is initiated by this object. |
| 424 NotifyOwnerCloseIfAllDone(); | 412 NotifyOwnerCloseIfAllDone(); |
| 425 } else { | 413 } else { |
| 426 // The close operation is initiated by |web_socket_|; start closing this | 414 // The close operation is initiated by |web_socket_|; start closing this |
| 427 // object. | 415 // object. |
| 428 Close(); | 416 Close(); |
| 429 } | 417 } |
| 430 } | 418 } |
| 431 | 419 |
| 432 } // namespace mojo | 420 } // namespace mojo |
| OLD | NEW |