failing_http_transaction_factory.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/http/failing_http_transaction_factory.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/compiler_specific.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/logging.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/base/load_timing_info.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/base/upload_progress.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace net { 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class AuthCredentials; 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class BoundNetLog; 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class HttpRequestHeaders; 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class IOBuffer; 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class X509Certificate; 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct HttpRequestInfo; 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// A simple class to interpose between the cache and network http layers. 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// These transactions can be generated by the FailingHttpTransactionFactory 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// to test interactions between cache and network. 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FailingHttpTransaction : public HttpTransaction { 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit FailingHttpTransaction(Error error); 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~FailingHttpTransaction(); 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // HttpTransaction 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual int Start(const HttpRequestInfo* request_info, 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CompletionCallback& callback, 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const BoundNetLog& net_log) OVERRIDE; 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual int RestartIgnoringLastError( 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CompletionCallback& callback) OVERRIDE; 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual int RestartWithCertificate( 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) X509Certificate* client_cert, 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CompletionCallback& callback) OVERRIDE; 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual int RestartWithAuth( 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const AuthCredentials& credentials, 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CompletionCallback& callback) OVERRIDE; 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool IsReadyToRestartForAuth() OVERRIDE; 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual int Read(IOBuffer* buf, int buf_len, 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CompletionCallback& callback) OVERRIDE; 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void StopCaching() OVERRIDE; 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool GetFullRequestHeaders( 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HttpRequestHeaders* headers) const OVERRIDE; 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual int64 GetTotalReceivedBytes() const OVERRIDE; 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DoneReading() OVERRIDE; 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual const HttpResponseInfo* GetResponseInfo() const OVERRIDE; 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual LoadState GetLoadState() const OVERRIDE; 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual UploadProgress GetUploadProgress() const OVERRIDE; 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetQuicServerInfo( 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::QuicServerInfo* quic_server_info) OVERRIDE; 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool GetLoadTimingInfo( 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoadTimingInfo* load_timing_info) const OVERRIDE; 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetPriority(RequestPriority priority) OVERRIDE; 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetWebSocketHandshakeStreamCreateHelper( 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebSocketHandshakeStreamBase::CreateHelper* create_helper) OVERRIDE; 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetBeforeNetworkStartCallback( 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const BeforeNetworkStartCallback& callback) OVERRIDE; 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual int ResumeNetworkStart() OVERRIDE; 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Error error_; 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FailingHttpTransaction::FailingHttpTransaction(Error error) : error_(error) { 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_LT(error, OK); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FailingHttpTransaction::~FailingHttpTransaction() {} 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int FailingHttpTransaction::Start(const HttpRequestInfo* request_info, 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CompletionCallback& callback, 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const BoundNetLog& net_log) { 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoop::current()->PostTask( 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, base::Bind(callback, error_)); 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ERR_IO_PENDING; 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int FailingHttpTransaction::RestartIgnoringLastError( 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CompletionCallback& callback) { 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ERR_FAILED; 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int FailingHttpTransaction::RestartWithCertificate( 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) X509Certificate* client_cert, 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CompletionCallback& callback) { 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ERR_FAILED; 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int FailingHttpTransaction::RestartWithAuth( 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const AuthCredentials& credentials, 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CompletionCallback& callback) { 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ERR_FAILED; 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool FailingHttpTransaction::IsReadyToRestartForAuth() { 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int FailingHttpTransaction::Read(IOBuffer* buf, int buf_len, 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CompletionCallback& callback) { 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ERR_FAILED; 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FailingHttpTransaction::StopCaching() {} 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool FailingHttpTransaction::GetFullRequestHeaders( 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HttpRequestHeaders* headers) const { 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int64 FailingHttpTransaction::GetTotalReceivedBytes() const { 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FailingHttpTransaction::DoneReading() { 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const HttpResponseInfo* FailingHttpTransaction::GetResponseInfo() const { 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)LoadState FailingHttpTransaction::GetLoadState() const { 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return LOAD_STATE_IDLE; 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UploadProgress FailingHttpTransaction::GetUploadProgress() const { 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return UploadProgress(); 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FailingHttpTransaction::SetQuicServerInfo( 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::QuicServerInfo* quic_server_info) {} 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool FailingHttpTransaction::GetLoadTimingInfo( 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoadTimingInfo* load_timing_info) const { 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FailingHttpTransaction::SetPriority(RequestPriority priority) {} 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FailingHttpTransaction::SetWebSocketHandshakeStreamCreateHelper( 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebSocketHandshakeStreamBase::CreateHelper* create_helper) { 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FailingHttpTransaction::SetBeforeNetworkStartCallback( 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const BeforeNetworkStartCallback& callback) { 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int FailingHttpTransaction::ResumeNetworkStart() { 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ERR_FAILED; 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FailingHttpTransactionFactory::FailingHttpTransactionFactory( 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HttpNetworkSession* session, 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Error error) : session_(session), error_(error) { 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_LT(error, OK); 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FailingHttpTransactionFactory::~FailingHttpTransactionFactory() {} 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// HttpTransactionFactory: 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int FailingHttpTransactionFactory::CreateTransaction( 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestPriority priority, 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<HttpTransaction>* trans) { 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) trans->reset(new FailingHttpTransaction(error_)); 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return OK; 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)HttpCache* FailingHttpTransactionFactory::GetCache() { 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)HttpNetworkSession* FailingHttpTransactionFactory::GetSession() { 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return session_; 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace net 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 192