1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/netwerk/protocol/http/NullHttpTransaction.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,190 @@ 1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* vim: set sw=2 ts=8 et tw=80 : */ 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +// HttpLog.h should generally be included first 1.11 +#include "HttpLog.h" 1.12 + 1.13 +#include "nsHttp.h" 1.14 +#include "NullHttpTransaction.h" 1.15 +#include "nsHttpHandler.h" 1.16 +#include "nsHttpRequestHead.h" 1.17 + 1.18 +namespace mozilla { 1.19 +namespace net { 1.20 + 1.21 +NS_IMPL_ISUPPORTS0(NullHttpTransaction) 1.22 + 1.23 +NullHttpTransaction::NullHttpTransaction(nsHttpConnectionInfo *ci, 1.24 + nsIInterfaceRequestor *callbacks, 1.25 + uint32_t caps) 1.26 + : mStatus(NS_OK) 1.27 + , mCaps(caps | NS_HTTP_ALLOW_KEEPALIVE) 1.28 + , mCapsToClear(0) 1.29 + , mCallbacks(callbacks) 1.30 + , mConnectionInfo(ci) 1.31 + , mRequestHead(nullptr) 1.32 + , mIsDone(false) 1.33 +{ 1.34 +} 1.35 + 1.36 +NullHttpTransaction::~NullHttpTransaction() 1.37 +{ 1.38 + mCallbacks = nullptr; 1.39 + delete mRequestHead; 1.40 +} 1.41 + 1.42 +void 1.43 +NullHttpTransaction::SetConnection(nsAHttpConnection *conn) 1.44 +{ 1.45 + mConnection = conn; 1.46 +} 1.47 + 1.48 +nsAHttpConnection * 1.49 +NullHttpTransaction::Connection() 1.50 +{ 1.51 + return mConnection.get(); 1.52 +} 1.53 + 1.54 +void 1.55 +NullHttpTransaction::GetSecurityCallbacks(nsIInterfaceRequestor **outCB) 1.56 +{ 1.57 + nsCOMPtr<nsIInterfaceRequestor> copyCB(mCallbacks); 1.58 + *outCB = copyCB.forget().take(); 1.59 +} 1.60 + 1.61 +void 1.62 +NullHttpTransaction::OnTransportStatus(nsITransport* transport, 1.63 + nsresult status, uint64_t progress) 1.64 +{ 1.65 +} 1.66 + 1.67 +bool 1.68 +NullHttpTransaction::IsDone() 1.69 +{ 1.70 + return mIsDone; 1.71 +} 1.72 + 1.73 +nsresult 1.74 +NullHttpTransaction::Status() 1.75 +{ 1.76 + return mStatus; 1.77 +} 1.78 + 1.79 +uint32_t 1.80 +NullHttpTransaction::Caps() 1.81 +{ 1.82 + return mCaps & ~mCapsToClear; 1.83 +} 1.84 + 1.85 +void 1.86 +NullHttpTransaction::SetDNSWasRefreshed() 1.87 +{ 1.88 + MOZ_ASSERT(NS_IsMainThread(), "SetDNSWasRefreshed on main thread only!"); 1.89 + mCapsToClear |= NS_HTTP_REFRESH_DNS; 1.90 +} 1.91 + 1.92 +uint64_t 1.93 +NullHttpTransaction::Available() 1.94 +{ 1.95 + return 0; 1.96 +} 1.97 + 1.98 +nsresult 1.99 +NullHttpTransaction::ReadSegments(nsAHttpSegmentReader *reader, 1.100 + uint32_t count, uint32_t *countRead) 1.101 +{ 1.102 + *countRead = 0; 1.103 + mIsDone = true; 1.104 + return NS_BASE_STREAM_CLOSED; 1.105 +} 1.106 + 1.107 +nsresult 1.108 +NullHttpTransaction::WriteSegments(nsAHttpSegmentWriter *writer, 1.109 + uint32_t count, uint32_t *countWritten) 1.110 +{ 1.111 + *countWritten = 0; 1.112 + return NS_BASE_STREAM_CLOSED; 1.113 +} 1.114 + 1.115 +uint32_t 1.116 +NullHttpTransaction::Http1xTransactionCount() 1.117 +{ 1.118 + return 0; 1.119 +} 1.120 + 1.121 +nsHttpRequestHead * 1.122 +NullHttpTransaction::RequestHead() 1.123 +{ 1.124 + // We suport a requesthead at all so that a CONNECT tunnel transaction 1.125 + // can obtain a Host header from it, but we lazy-popualate that header. 1.126 + 1.127 + if (!mRequestHead) { 1.128 + mRequestHead = new nsHttpRequestHead(); 1.129 + 1.130 + nsAutoCString hostHeader; 1.131 + nsCString host(mConnectionInfo->GetHost()); 1.132 + nsresult rv = nsHttpHandler::GenerateHostPort(host, 1.133 + mConnectionInfo->Port(), 1.134 + hostHeader); 1.135 + if (NS_SUCCEEDED(rv)) 1.136 + mRequestHead->SetHeader(nsHttp::Host, hostHeader); 1.137 + 1.138 + // CONNECT tunnels may also want Proxy-Authorization but that is a lot 1.139 + // harder to determine, so for now we will let those connections fail in 1.140 + // the NullHttpTransaction and let them be retried from the pending queue 1.141 + // with a bound transcation 1.142 + } 1.143 + 1.144 + return mRequestHead; 1.145 +} 1.146 + 1.147 +nsresult 1.148 +NullHttpTransaction::TakeSubTransactions( 1.149 + nsTArray<nsRefPtr<nsAHttpTransaction> > &outTransactions) 1.150 +{ 1.151 + return NS_ERROR_NOT_IMPLEMENTED; 1.152 +} 1.153 + 1.154 +void 1.155 +NullHttpTransaction::SetProxyConnectFailed() 1.156 +{ 1.157 +} 1.158 + 1.159 +void 1.160 +NullHttpTransaction::Close(nsresult reason) 1.161 +{ 1.162 + mStatus = reason; 1.163 + mConnection = nullptr; 1.164 + mIsDone = true; 1.165 +} 1.166 + 1.167 +nsresult 1.168 +NullHttpTransaction::AddTransaction(nsAHttpTransaction *trans) 1.169 +{ 1.170 + return NS_ERROR_NOT_IMPLEMENTED; 1.171 +} 1.172 + 1.173 +uint32_t 1.174 +NullHttpTransaction::PipelineDepth() 1.175 +{ 1.176 + return 0; 1.177 +} 1.178 + 1.179 +nsresult 1.180 +NullHttpTransaction::SetPipelinePosition(int32_t position) 1.181 +{ 1.182 + return NS_OK; 1.183 +} 1.184 + 1.185 +int32_t 1.186 +NullHttpTransaction::PipelinePosition() 1.187 +{ 1.188 + return 1; 1.189 +} 1.190 + 1.191 +} // namespace mozilla::net 1.192 +} // namespace mozilla 1.193 +