/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* 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/. */ #ifndef nsHttpPipeline_h__ #define nsHttpPipeline_h__ #include "nsAHttpConnection.h" #include "nsAHttpTransaction.h" #include "nsTArray.h" #include "nsCOMPtr.h" class nsIInputStream; class nsIOutputStream; namespace mozilla { namespace net { class nsHttpPipeline final : public nsAHttpConnection , public nsAHttpTransaction , public nsAHttpSegmentReader { public: NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSAHTTPCONNECTION(mConnection) NS_DECL_NSAHTTPTRANSACTION NS_DECL_NSAHTTPSEGMENTREADER nsHttpPipeline(); bool ResponseTimeoutEnabled() const override final { return true; } private: virtual ~nsHttpPipeline(); nsresult FillSendBuf(); static nsresult ReadFromPipe(nsIInputStream *, void *, const char *, uint32_t, uint32_t, uint32_t *); // convenience functions nsAHttpTransaction *Request(int32_t i) { if (mRequestQ.Length() == 0) return nullptr; return mRequestQ[i]; } nsAHttpTransaction *Response(int32_t i) { if (mResponseQ.Length() == 0) return nullptr; return mResponseQ[i]; } // overload of nsAHttpTransaction::QueryPipeline() nsHttpPipeline *QueryPipeline() override; RefPtr<nsAHttpConnection> mConnection; nsTArray<RefPtr<nsAHttpTransaction> > mRequestQ; nsTArray<RefPtr<nsAHttpTransaction> > mResponseQ; nsresult mStatus; // these flags indicate whether or not the first request or response // is partial. a partial request means that Request(0) has been // partially written out to the socket. a partial response means // that Response(0) has been partially read in from the socket. bool mRequestIsPartial; bool mResponseIsPartial; // indicates whether or not the pipeline has been explicitly closed. bool mClosed; // indicates whether or not a true pipeline (more than 1 request without // a synchronous response) has been formed. bool mUtilizedPipeline; // used when calling ReadSegments/WriteSegments on a transaction. nsAHttpSegmentReader *mReader; // send buffer nsCOMPtr<nsIInputStream> mSendBufIn; nsCOMPtr<nsIOutputStream> mSendBufOut; // the push back buffer. not exceeding nsIOService::gDefaultSegmentSize bytes. char *mPushBackBuf; uint32_t mPushBackLen; uint32_t mPushBackMax; // The number of transactions completed on this pipeline. uint32_t mHttp1xTransactionCount; // For support of OnTransportStatus() int64_t mReceivingFromProgress; int64_t mSendingToProgress; bool mSuppressSendEvents; }; } // namespace net } // namespace mozilla #endif // nsHttpPipeline_h__