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