1// Copyright (c) 2012 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/power_monitor/power_monitor.h"
9#include "base/strings/string_number_conversions.h"
10#include "base/strings/string_split.h"
11#include "base/strings/string_util.h"
12#include "net/http/http_network_session.h"
13#include "net/http/http_network_transaction.h"
14#include "net/http/http_server_properties_impl.h"
15#include "net/http/http_stream_factory_impl_job.h"
16#include "net/spdy/spdy_framer.h"
17#include "net/spdy/spdy_session.h"
18#include "net/spdy/spdy_session_pool.h"
19
20namespace net {
21
22//-----------------------------------------------------------------------------
23HttpNetworkLayer::HttpNetworkLayer(HttpNetworkSession* session)
24    : session_(session),
25      suspended_(false) {
26  DCHECK(session_.get());
27#if defined(OS_WIN)
28 base::PowerMonitor* power_monitor = base::PowerMonitor::Get();
29 if (power_monitor)
30   power_monitor->AddObserver(this);
31#endif
32}
33
34HttpNetworkLayer::~HttpNetworkLayer() {
35#if defined(OS_WIN)
36  base::PowerMonitor* power_monitor = base::PowerMonitor::Get();
37  if (power_monitor)
38    power_monitor->RemoveObserver(this);
39#endif
40}
41
42//-----------------------------------------------------------------------------
43
44// static
45HttpTransactionFactory* HttpNetworkLayer::CreateFactory(
46    HttpNetworkSession* session) {
47  DCHECK(session);
48
49  return new HttpNetworkLayer(session);
50}
51
52// static
53void HttpNetworkLayer::ForceAlternateProtocol() {
54  PortAlternateProtocolPair pair;
55  pair.port = 443;
56  pair.protocol = NPN_SPDY_3;
57  HttpServerPropertiesImpl::ForceAlternateProtocol(pair);
58}
59
60//-----------------------------------------------------------------------------
61
62int HttpNetworkLayer::CreateTransaction(RequestPriority priority,
63                                        scoped_ptr<HttpTransaction>* trans) {
64  if (suspended_)
65    return ERR_NETWORK_IO_SUSPENDED;
66
67  trans->reset(new HttpNetworkTransaction(priority, GetSession()));
68  return OK;
69}
70
71HttpCache* HttpNetworkLayer::GetCache() {
72  return NULL;
73}
74
75HttpNetworkSession* HttpNetworkLayer::GetSession() { return session_.get(); }
76
77void HttpNetworkLayer::OnSuspend() {
78  suspended_ = true;
79
80  if (session_.get())
81    session_->CloseIdleConnections();
82}
83
84void HttpNetworkLayer::OnResume() {
85  suspended_ = false;
86}
87
88}  // namespace net
89