/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* 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 HttpConnectionUDP_h__ #define HttpConnectionUDP_h__ #include "HttpConnectionBase.h" #include "nsHttpConnectionInfo.h" #include "nsHttpResponseHead.h" #include "nsAHttpTransaction.h" #include "nsCOMPtr.h" #include "nsProxyRelease.h" #include "prinrval.h" #include "mozilla/Mutex.h" #include "ARefBase.h" #include "TimingStruct.h" #include "HttpTrafficAnalyzer.h" #include "nsIAsyncInputStream.h" #include "nsIAsyncOutputStream.h" #include "nsISupportsPriority.h" #include "nsIInterfaceRequestor.h" #include "nsITimer.h" #include "Http3Session.h" class nsIDNSRecord; class nsISocketTransport; class nsITLSSocketControl; namespace mozilla { namespace net { class nsHttpHandler; class ASpdySession; // 1dcc863e-db90-4652-a1fe-13fea0b54e46 #define HTTPCONNECTIONUDP_IID \ { \ 0xb97d2036, 0xb441, 0x48be, { \ 0xb3, 0x1e, 0x25, 0x3e, 0xe8, 0x32, 0xdd, 0x67 \ } \ } //----------------------------------------------------------------------------- // HttpConnectionUDP - represents a connection to a HTTP3 server // // NOTE: this objects lives on the socket thread only. it should not be // accessed from any other thread. //----------------------------------------------------------------------------- class HttpConnectionUDP final : public HttpConnectionBase, public nsIUDPSocketSyncListener, public nsIInterfaceRequestor { private: virtual ~HttpConnectionUDP(); public: NS_DECLARE_STATIC_IID_ACCESSOR(HTTPCONNECTIONUDP_IID) NS_DECL_HTTPCONNECTIONBASE NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIUDPSOCKETSYNCLISTENER NS_DECL_NSIINTERFACEREQUESTOR HttpConnectionUDP(); [[nodiscard]] nsresult Init(nsHttpConnectionInfo* info, nsIDNSRecord* dnsRecord, nsresult status, nsIInterfaceRequestor* callbacks, uint32_t caps); friend class HttpConnectionUDPForceIO; [[nodiscard]] static nsresult ReadFromStream(nsIInputStream*, void*, const char*, uint32_t, uint32_t, uint32_t*); bool UsingHttp3() override { return true; } void OnQuicTimeoutExpired(); int64_t BytesWritten() override; nsresult GetSelfAddr(NetAddr* addr) override; nsresult GetPeerAddr(NetAddr* addr) override; bool ResolvedByTRR() override; nsIRequest::TRRMode EffectiveTRRMode() override; TRRSkippedReason TRRSkipReason() override; bool GetEchConfigUsed() override { return false; } void NotifyDataRead(); void NotifyDataWrite(); private: [[nodiscard]] nsresult OnTransactionDone(nsresult reason); nsresult RecvData(); nsresult SendData(); private: RefPtr mHttpHandler; // keep gHttpHandler alive RefPtr mInputOverflow; bool mConnectedTransport = false; bool mDontReuse = false; bool mIsReused = false; bool mLastTransactionExpectedNoContent = false; int32_t mPriority = nsISupportsPriority::PRIORITY_NORMAL; private: // For ForceSend() static void ForceSendIO(nsITimer* aTimer, void* aClosure); [[nodiscard]] nsresult MaybeForceSendIO(); bool mForceSendPending = false; nsCOMPtr mForceSendTimer; PRIntervalTime mLastRequestBytesSentTime = 0; nsCOMPtr mSocket; nsCOMPtr mSelfAddr; nsCOMPtr mPeerAddr; bool mResolvedByTRR = false; nsIRequest::TRRMode mEffectiveTRRMode = nsIRequest::TRR_DEFAULT_MODE; TRRSkippedReason mTRRSkipReason = nsITRRSkipReason::TRR_UNSET; private: // Http3 RefPtr mHttp3Session; nsCString mAlpnToken; }; NS_DEFINE_STATIC_IID_ACCESSOR(HttpConnectionUDP, HTTPCONNECTIONUDP_IID) } // namespace net } // namespace mozilla #endif // HttpConnectionUDP_h__