summaryrefslogtreecommitdiffstats
path: root/src/network/access/qhttp2connection_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/access/qhttp2connection_p.h')
-rw-r--r--src/network/access/qhttp2connection_p.h22
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: