| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/browser/chromeos/web_socket_proxy.h" | 5 #include "chrome/browser/chromeos/web_socket_proxy.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 #include <stdlib.h> | 8 #include <stdlib.h> |
| 9 #include <string.h> | 9 #include <string.h> |
| 10 | 10 |
| 11 #include <algorithm> | 11 #include <algorithm> |
| 12 #include <limits> | 12 #include <limits> |
| 13 #include <list> | 13 #include <list> |
| 14 #include <map> | 14 #include <map> |
| 15 #include <vector> | 15 #include <vector> |
| 16 | 16 |
| 17 #include <arpa/inet.h> | 17 #include <arpa/inet.h> |
| 18 #include <errno.h> | 18 #include <errno.h> |
| 19 #include <fcntl.h> | 19 #include <fcntl.h> |
| 20 #include <netinet/in.h> | 20 #include <netinet/in.h> |
| 21 #include <signal.h> | 21 #include <signal.h> |
| 22 #include <sys/socket.h> | 22 #include <sys/socket.h> |
| 23 #include <sys/types.h> | 23 #include <sys/types.h> |
| 24 #include <sys/wait.h> | 24 #include <sys/wait.h> |
| 25 | 25 |
| 26 #include "base/base64.h" | 26 #include "base/base64.h" |
| 27 #include "base/basictypes.h" | 27 #include "base/basictypes.h" |
| 28 #include "base/bind.h" | 28 #include "base/bind.h" |
| 29 #include "base/bind_helpers.h" |
| 29 #include "base/lazy_instance.h" | 30 #include "base/lazy_instance.h" |
| 30 #include "base/logging.h" | 31 #include "base/logging.h" |
| 31 #include "base/memory/ref_counted.h" | 32 #include "base/memory/ref_counted.h" |
| 32 #include "base/memory/scoped_ptr.h" | 33 #include "base/memory/scoped_ptr.h" |
| 33 #include "base/message_loop.h" | 34 #include "base/message_loop.h" |
| 34 #include "base/sha1.h" | 35 #include "base/sha1.h" |
| 35 #include "base/stl_util.h" | 36 #include "base/stl_util.h" |
| 36 #include "base/string_number_conversions.h" | 37 #include "base/string_number_conversions.h" |
| 37 #include "base/string_util.h" | 38 #include "base/string_util.h" |
| 38 #include "chrome/browser/chromeos/web_socket_proxy_helper.h" | 39 #include "chrome/browser/chromeos/web_socket_proxy_helper.h" |
| (...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 const net::HostPortPair host_port_pair, | 548 const net::HostPortPair host_port_pair, |
| 548 int read_pipe, | 549 int read_pipe, |
| 549 int write_pipe) | 550 int write_pipe) |
| 550 : phase_(PHASE_CONNECTING), | 551 : phase_(PHASE_CONNECTING), |
| 551 host_port_pair_(host_port_pair), | 552 host_port_pair_(host_port_pair), |
| 552 inbound_stream_(WebSocketProxy::kBufferLimit), | 553 inbound_stream_(WebSocketProxy::kBufferLimit), |
| 553 outbound_stream_(WebSocketProxy::kBufferLimit), | 554 outbound_stream_(WebSocketProxy::kBufferLimit), |
| 554 read_pipe_(read_pipe), | 555 read_pipe_(read_pipe), |
| 555 write_pipe_(write_pipe), | 556 write_pipe_(write_pipe), |
| 556 method_factory_(this), | 557 method_factory_(this), |
| 557 socket_connect_callback_(NewCallback(this, &SSLChan::OnSocketConnect)), | 558 socket_connect_callback_( |
| 559 base::Bind(&SSLChan::OnSocketConnect, base::Unretained(this))), |
| 558 ssl_handshake_callback_( | 560 ssl_handshake_callback_( |
| 559 NewCallback(this, &SSLChan::OnSSLHandshakeCompleted)), | 561 base::Bind(&SSLChan::OnSSLHandshakeCompleted, |
| 562 base::Unretained(this))), |
| 560 socket_read_callback_(NewCallback(this, &SSLChan::OnSocketRead)), | 563 socket_read_callback_(NewCallback(this, &SSLChan::OnSocketRead)), |
| 561 socket_write_callback_(NewCallback(this, &SSLChan::OnSocketWrite)) { | 564 socket_write_callback_(NewCallback(this, &SSLChan::OnSocketWrite)) { |
| 562 if (!SetNonBlock(read_pipe_) || !SetNonBlock(write_pipe_)) { | 565 if (!SetNonBlock(read_pipe_) || !SetNonBlock(write_pipe_)) { |
| 563 Shut(net::ERR_UNEXPECTED); | 566 Shut(net::ERR_UNEXPECTED); |
| 564 return; | 567 return; |
| 565 } | 568 } |
| 566 net::ClientSocketFactory* factory = | 569 net::ClientSocketFactory* factory = |
| 567 net::ClientSocketFactory::GetDefaultFactory(); | 570 net::ClientSocketFactory::GetDefaultFactory(); |
| 568 socket_.reset(factory->CreateTransportClientSocket( | 571 socket_.reset(factory->CreateTransportClientSocket( |
| 569 address_list, NULL, net::NetLog::Source())); | 572 address_list, NULL, net::NetLog::Source())); |
| 570 if (socket_ == NULL) { | 573 if (socket_ == NULL) { |
| 571 Shut(net::ERR_FAILED); | 574 Shut(net::ERR_FAILED); |
| 572 return; | 575 return; |
| 573 } | 576 } |
| 574 int result = socket_->Connect(socket_connect_callback_.get()); | 577 int result = socket_->Connect(socket_connect_callback_); |
| 575 if (result != net::ERR_IO_PENDING) | 578 if (result != net::ERR_IO_PENDING) |
| 576 OnSocketConnect(result); | 579 OnSocketConnect(result); |
| 577 } | 580 } |
| 578 | 581 |
| 579 ~SSLChan() { | 582 ~SSLChan() { |
| 580 phase_ = PHASE_CLOSED; | 583 phase_ = PHASE_CLOSED; |
| 581 write_pipe_controller_.StopWatchingFileDescriptor(); | 584 write_pipe_controller_.StopWatchingFileDescriptor(); |
| 582 read_pipe_controller_.StopWatchingFileDescriptor(); | 585 read_pipe_controller_.StopWatchingFileDescriptor(); |
| 583 close(write_pipe_); | 586 close(write_pipe_); |
| 584 close(read_pipe_); | 587 close(read_pipe_); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 624 if (!cert_verifier_.get()) | 627 if (!cert_verifier_.get()) |
| 625 cert_verifier_.reset(new net::CertVerifier()); | 628 cert_verifier_.reset(new net::CertVerifier()); |
| 626 ssl_context.cert_verifier = cert_verifier_.get(); | 629 ssl_context.cert_verifier = cert_verifier_.get(); |
| 627 socket_.reset(factory->CreateSSLClientSocket( | 630 socket_.reset(factory->CreateSSLClientSocket( |
| 628 handle, host_port_pair_, ssl_config_, NULL, ssl_context)); | 631 handle, host_port_pair_, ssl_config_, NULL, ssl_context)); |
| 629 if (!socket_.get()) { | 632 if (!socket_.get()) { |
| 630 LOG(WARNING) << "Failed to create an SSL client socket."; | 633 LOG(WARNING) << "Failed to create an SSL client socket."; |
| 631 OnSSLHandshakeCompleted(net::ERR_UNEXPECTED); | 634 OnSSLHandshakeCompleted(net::ERR_UNEXPECTED); |
| 632 return; | 635 return; |
| 633 } | 636 } |
| 634 result = socket_->Connect(ssl_handshake_callback_.get()); | 637 result = socket_->Connect(ssl_handshake_callback_); |
| 635 if (result != net::ERR_IO_PENDING) | 638 if (result != net::ERR_IO_PENDING) |
| 636 OnSSLHandshakeCompleted(result); | 639 OnSSLHandshakeCompleted(result); |
| 637 } | 640 } |
| 638 | 641 |
| 639 void OnSSLHandshakeCompleted(int result) { | 642 void OnSSLHandshakeCompleted(int result) { |
| 640 if (result) { | 643 if (result) { |
| 641 Shut(result); | 644 Shut(result); |
| 642 return; | 645 return; |
| 643 } | 646 } |
| 644 is_socket_read_pending_ = false; | 647 is_socket_read_pending_ = false; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 785 net::SSLConfig ssl_config_; | 788 net::SSLConfig ssl_config_; |
| 786 IOBufferQueue inbound_stream_; | 789 IOBufferQueue inbound_stream_; |
| 787 IOBufferQueue outbound_stream_; | 790 IOBufferQueue outbound_stream_; |
| 788 int read_pipe_; | 791 int read_pipe_; |
| 789 int write_pipe_; | 792 int write_pipe_; |
| 790 bool is_socket_read_pending_; | 793 bool is_socket_read_pending_; |
| 791 bool is_socket_write_pending_; | 794 bool is_socket_write_pending_; |
| 792 bool is_read_pipe_blocked_; | 795 bool is_read_pipe_blocked_; |
| 793 bool is_write_pipe_blocked_; | 796 bool is_write_pipe_blocked_; |
| 794 ScopedRunnableMethodFactory<SSLChan> method_factory_; | 797 ScopedRunnableMethodFactory<SSLChan> method_factory_; |
| 795 scoped_ptr<net::OldCompletionCallback> socket_connect_callback_; | 798 net::CompletionCallback socket_connect_callback_; |
| 796 scoped_ptr<net::OldCompletionCallback> ssl_handshake_callback_; | 799 net::CompletionCallback ssl_handshake_callback_; |
| 797 scoped_ptr<net::OldCompletionCallback> socket_read_callback_; | 800 scoped_ptr<net::OldCompletionCallback> socket_read_callback_; |
| 798 scoped_ptr<net::OldCompletionCallback> socket_write_callback_; | 801 scoped_ptr<net::OldCompletionCallback> socket_write_callback_; |
| 799 MessageLoopForIO::FileDescriptorWatcher read_pipe_controller_; | 802 MessageLoopForIO::FileDescriptorWatcher read_pipe_controller_; |
| 800 MessageLoopForIO::FileDescriptorWatcher write_pipe_controller_; | 803 MessageLoopForIO::FileDescriptorWatcher write_pipe_controller_; |
| 801 | 804 |
| 802 friend class DeleteTask<SSLChan>; | 805 friend class DeleteTask<SSLChan>; |
| 803 DISALLOW_COPY_AND_ASSIGN(SSLChan); | 806 DISALLOW_COPY_AND_ASSIGN(SSLChan); |
| 804 }; | 807 }; |
| 805 | 808 |
| 806 Serv::Serv(const std::vector<std::string>& allowed_origins) | 809 Serv::Serv(const std::vector<std::string>& allowed_origins) |
| (...skipping 1107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1914 | 1917 |
| 1915 void WebSocketProxy::Shutdown() { | 1918 void WebSocketProxy::Shutdown() { |
| 1916 static_cast<Serv*>(impl_)->Shutdown(); | 1919 static_cast<Serv*>(impl_)->Shutdown(); |
| 1917 } | 1920 } |
| 1918 | 1921 |
| 1919 void WebSocketProxy::OnNetworkChange() { | 1922 void WebSocketProxy::OnNetworkChange() { |
| 1920 static_cast<Serv*>(impl_)->OnNetworkChange(); | 1923 static_cast<Serv*>(impl_)->OnNetworkChange(); |
| 1921 } | 1924 } |
| 1922 | 1925 |
| 1923 } // namespace chromeos | 1926 } // namespace chromeos |
| OLD | NEW |