diff options
Diffstat (limited to 'src/network/access/qhttp2connection_p.h')
| -rw-r--r-- | src/network/access/qhttp2connection_p.h | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/network/access/qhttp2connection_p.h b/src/network/access/qhttp2connection_p.h index e2af7d7ab33..d9f2bccc58a 100644 --- a/src/network/access/qhttp2connection_p.h +++ b/src/network/access/qhttp2connection_p.h @@ -260,7 +260,7 @@ public: return nullptr; } - void close(Http2::Http2Error error = Http2::HTTP2_NO_ERROR) { sendGOAWAY(error); } + void close(Http2::Http2Error errorCode = Http2::HTTP2_NO_ERROR); bool isGoingAway() const noexcept { return m_goingAway; } @@ -302,8 +302,7 @@ private: Q_ALWAYS_INLINE bool streamIsIgnored(quint32 streamID) const noexcept; - void connectionError(Http2::Http2Error errorCode, - const char *message); // Connection failed to be established? + void connectionError(Http2::Http2Error errorCode, const char *message, bool logAsError = true); void setH2Configuration(QHttp2Configuration config); void closeSession(); void registerStreamAsResetLocally(quint32 streamID); @@ -316,7 +315,11 @@ private: bool sendServerPreface(); bool serverCheckClientPreface(); bool sendWINDOW_UPDATE(quint32 streamID, quint32 delta); - bool sendGOAWAY(Http2::Http2Error errorCode); + void sendClientGracefulShutdownGoaway(); + void sendInitialServerGracefulShutdownGoaway(); + void sendFinalServerGracefulShutdownGoaway(); + bool sendGOAWAYFrame(Http2::Http2Error errorCode, quint32 lastSreamID); + void maybeCloseOnGoingAway(); bool sendSETTINGS_ACK(); void handleDATA(); @@ -423,6 +426,17 @@ private: static constexpr std::chrono::duration GoawayGracePeriod = std::chrono::seconds(60); QDeadlineTimer m_goawayGraceTimer; + std::optional<quint32> m_lastGoAwayLastStreamID; + bool m_connectionAborted = false; + + enum class GracefulShutdownState { + None, + AwaitingPriorPing, + AwaitingShutdownPing, + FinalGOAWAYSent, + }; + GracefulShutdownState m_gracefulShutdownState = GracefulShutdownState::None; + bool m_prefaceSent = false; // Server-side only: |
