15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_layer.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/power_monitor/power_monitor.h" 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_transaction.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_server_properties_impl.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_stream_factory_impl_job.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_framer.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_session.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_session_pool.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//----------------------------------------------------------------------------- 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpNetworkLayer::HttpNetworkLayer(HttpNetworkSession* session) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : session_(session), 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) suspended_(false) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(session_.get()); 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::PowerMonitor* power_monitor = base::PowerMonitor::Get(); 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (power_monitor) 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) power_monitor->AddObserver(this); 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpNetworkLayer::~HttpNetworkLayer() { 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::PowerMonitor* power_monitor = base::PowerMonitor::Get(); 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (power_monitor) 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) power_monitor->RemoveObserver(this); 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//----------------------------------------------------------------------------- 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpTransactionFactory* HttpNetworkLayer::CreateFactory( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession* session) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(session); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new HttpNetworkLayer(session); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HttpNetworkLayer::ForceAlternateProtocol() { 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AlternateProtocolInfo pair(443, NPN_SPDY_3, 1); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpServerPropertiesImpl::ForceAlternateProtocol(pair); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//----------------------------------------------------------------------------- 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int HttpNetworkLayer::CreateTransaction(RequestPriority priority, 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<HttpTransaction>* trans) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (suspended_) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ERR_NETWORK_IO_SUSPENDED; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) trans->reset(new HttpNetworkTransaction(priority, GetSession())); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpCache* HttpNetworkLayer::GetCache() { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)HttpNetworkSession* HttpNetworkLayer::GetSession() { return session_.get(); } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpNetworkLayer::OnSuspend() { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) suspended_ = true; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (session_.get()) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_->CloseIdleConnections(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpNetworkLayer::OnResume() { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) suspended_ = false; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 87