diff -r 000000000000 -r 6474c204b198 netwerk/protocol/http/NullHttpTransaction.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/netwerk/protocol/http/NullHttpTransaction.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,190 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set sw=2 ts=8 et tw=80 : */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// HttpLog.h should generally be included first +#include "HttpLog.h" + +#include "nsHttp.h" +#include "NullHttpTransaction.h" +#include "nsHttpHandler.h" +#include "nsHttpRequestHead.h" + +namespace mozilla { +namespace net { + +NS_IMPL_ISUPPORTS0(NullHttpTransaction) + +NullHttpTransaction::NullHttpTransaction(nsHttpConnectionInfo *ci, + nsIInterfaceRequestor *callbacks, + uint32_t caps) + : mStatus(NS_OK) + , mCaps(caps | NS_HTTP_ALLOW_KEEPALIVE) + , mCapsToClear(0) + , mCallbacks(callbacks) + , mConnectionInfo(ci) + , mRequestHead(nullptr) + , mIsDone(false) +{ +} + +NullHttpTransaction::~NullHttpTransaction() +{ + mCallbacks = nullptr; + delete mRequestHead; +} + +void +NullHttpTransaction::SetConnection(nsAHttpConnection *conn) +{ + mConnection = conn; +} + +nsAHttpConnection * +NullHttpTransaction::Connection() +{ + return mConnection.get(); +} + +void +NullHttpTransaction::GetSecurityCallbacks(nsIInterfaceRequestor **outCB) +{ + nsCOMPtr copyCB(mCallbacks); + *outCB = copyCB.forget().take(); +} + +void +NullHttpTransaction::OnTransportStatus(nsITransport* transport, + nsresult status, uint64_t progress) +{ +} + +bool +NullHttpTransaction::IsDone() +{ + return mIsDone; +} + +nsresult +NullHttpTransaction::Status() +{ + return mStatus; +} + +uint32_t +NullHttpTransaction::Caps() +{ + return mCaps & ~mCapsToClear; +} + +void +NullHttpTransaction::SetDNSWasRefreshed() +{ + MOZ_ASSERT(NS_IsMainThread(), "SetDNSWasRefreshed on main thread only!"); + mCapsToClear |= NS_HTTP_REFRESH_DNS; +} + +uint64_t +NullHttpTransaction::Available() +{ + return 0; +} + +nsresult +NullHttpTransaction::ReadSegments(nsAHttpSegmentReader *reader, + uint32_t count, uint32_t *countRead) +{ + *countRead = 0; + mIsDone = true; + return NS_BASE_STREAM_CLOSED; +} + +nsresult +NullHttpTransaction::WriteSegments(nsAHttpSegmentWriter *writer, + uint32_t count, uint32_t *countWritten) +{ + *countWritten = 0; + return NS_BASE_STREAM_CLOSED; +} + +uint32_t +NullHttpTransaction::Http1xTransactionCount() +{ + return 0; +} + +nsHttpRequestHead * +NullHttpTransaction::RequestHead() +{ + // We suport a requesthead at all so that a CONNECT tunnel transaction + // can obtain a Host header from it, but we lazy-popualate that header. + + if (!mRequestHead) { + mRequestHead = new nsHttpRequestHead(); + + nsAutoCString hostHeader; + nsCString host(mConnectionInfo->GetHost()); + nsresult rv = nsHttpHandler::GenerateHostPort(host, + mConnectionInfo->Port(), + hostHeader); + if (NS_SUCCEEDED(rv)) + mRequestHead->SetHeader(nsHttp::Host, hostHeader); + + // CONNECT tunnels may also want Proxy-Authorization but that is a lot + // harder to determine, so for now we will let those connections fail in + // the NullHttpTransaction and let them be retried from the pending queue + // with a bound transcation + } + + return mRequestHead; +} + +nsresult +NullHttpTransaction::TakeSubTransactions( + nsTArray > &outTransactions) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + +void +NullHttpTransaction::SetProxyConnectFailed() +{ +} + +void +NullHttpTransaction::Close(nsresult reason) +{ + mStatus = reason; + mConnection = nullptr; + mIsDone = true; +} + +nsresult +NullHttpTransaction::AddTransaction(nsAHttpTransaction *trans) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + +uint32_t +NullHttpTransaction::PipelineDepth() +{ + return 0; +} + +nsresult +NullHttpTransaction::SetPipelinePosition(int32_t position) +{ + return NS_OK; +} + +int32_t +NullHttpTransaction::PipelinePosition() +{ + return 1; +} + +} // namespace mozilla::net +} // namespace mozilla +