1 // Copyright (c) 2006-2008 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 "net/http/http_network_layer.h" 6 7 #include "base/logging.h" 8 #include "base/string_util.h" 9 #include "net/flip/flip_framer.h" 10 #include "net/flip/flip_network_transaction.h" 11 #include "net/flip/flip_session.h" 12 #include "net/flip/flip_session_pool.h" 13 #include "net/http/http_network_session.h" 14 #include "net/http/http_network_transaction.h" 15 #include "net/socket/client_socket_factory.h" 16 17 namespace net { 18 19 //----------------------------------------------------------------------------- 20 21 // static 22 HttpTransactionFactory* HttpNetworkLayer::CreateFactory( 23 NetworkChangeNotifier* network_change_notifier, 24 HostResolver* host_resolver, 25 ProxyService* proxy_service, 26 SSLConfigService* ssl_config_service) { 27 DCHECK(proxy_service); 28 29 return new HttpNetworkLayer(ClientSocketFactory::GetDefaultFactory(), 30 network_change_notifier, 31 host_resolver, proxy_service, ssl_config_service); 32 } 33 34 // static 35 HttpTransactionFactory* HttpNetworkLayer::CreateFactory( 36 HttpNetworkSession* session) { 37 DCHECK(session); 38 39 return new HttpNetworkLayer(session); 40 } 41 42 //----------------------------------------------------------------------------- 43 bool HttpNetworkLayer::force_flip_ = false; 44 45 HttpNetworkLayer::HttpNetworkLayer( 46 ClientSocketFactory* socket_factory, 47 NetworkChangeNotifier* network_change_notifier, 48 HostResolver* host_resolver, 49 ProxyService* proxy_service, 50 SSLConfigService* ssl_config_service) 51 : socket_factory_(socket_factory), 52 network_change_notifier_(network_change_notifier), 53 host_resolver_(host_resolver), 54 proxy_service_(proxy_service), 55 ssl_config_service_(ssl_config_service), 56 session_(NULL), 57 flip_session_pool_(NULL), 58 suspended_(false) { 59 DCHECK(proxy_service_); 60 DCHECK(ssl_config_service_.get()); 61 } 62 63 HttpNetworkLayer::HttpNetworkLayer(HttpNetworkSession* session) 64 : socket_factory_(ClientSocketFactory::GetDefaultFactory()), 65 network_change_notifier_(NULL), 66 ssl_config_service_(NULL), 67 session_(session), 68 flip_session_pool_(session->flip_session_pool()), 69 suspended_(false) { 70 DCHECK(session_.get()); 71 } 72 73 HttpNetworkLayer::~HttpNetworkLayer() { 74 } 75 76 int HttpNetworkLayer::CreateTransaction(scoped_ptr<HttpTransaction>* trans) { 77 if (suspended_) 78 return ERR_NETWORK_IO_SUSPENDED; 79 80 if (force_flip_) 81 trans->reset(new FlipNetworkTransaction(GetSession())); 82 else 83 trans->reset(new HttpNetworkTransaction(GetSession())); 84 return OK; 85 } 86 87 HttpCache* HttpNetworkLayer::GetCache() { 88 return NULL; 89 } 90 91 void HttpNetworkLayer::Suspend(bool suspend) { 92 suspended_ = suspend; 93 94 if (suspend && session_) 95 session_->tcp_socket_pool()->CloseIdleSockets(); 96 } 97 98 HttpNetworkSession* HttpNetworkLayer::GetSession() { 99 if (!session_) { 100 DCHECK(proxy_service_); 101 FlipSessionPool* flip_pool = new FlipSessionPool; 102 session_ = new HttpNetworkSession( 103 network_change_notifier_, host_resolver_, proxy_service_, 104 socket_factory_, ssl_config_service_, flip_pool); 105 // These were just temps for lazy-initializing HttpNetworkSession. 106 network_change_notifier_ = NULL; 107 host_resolver_ = NULL; 108 proxy_service_ = NULL; 109 socket_factory_ = NULL; 110 } 111 return session_; 112 } 113 114 // static 115 void HttpNetworkLayer::EnableFlip(const std::string& mode) { 116 static const char kDisableSSL[] = "no-ssl"; 117 static const char kDisableCompression[] = "no-compress"; 118 static const char kEnableNPN[] = "npn"; 119 120 std::vector<std::string> flip_options; 121 SplitString(mode, ',', &flip_options); 122 123 // Force flip mode (use FlipNetworkTransaction for all http requests). 124 force_flip_ = true; 125 126 for (std::vector<std::string>::iterator it = flip_options.begin(); 127 it != flip_options.end(); ++it) { 128 const std::string& option = *it; 129 130 // Disable SSL 131 if (option == kDisableSSL) { 132 FlipSession::SetSSLMode(false); 133 } else if (option == kDisableCompression) { 134 flip::FlipFramer::set_enable_compression_default(false); 135 } else if (option == kEnableNPN) { 136 HttpNetworkTransaction::SetNextProtos("\007http1.1\004spdy"); 137 force_flip_ = false; 138 } else if (option.empty() && it == flip_options.begin()) { 139 continue; 140 } else { 141 LOG(DFATAL) << "Unrecognized flip option: " << option; 142 } 143 } 144 } 145 146 } // namespace net 147