| Index: net/quic/core/quic_spdy_session.cc
|
| diff --git a/net/quic/core/quic_spdy_session.cc b/net/quic/core/quic_spdy_session.cc
|
| index 4c14b615305ca1a86854f8c5d792f6184d793d92..61d16c9020abdb0d62d865fd57960e25884634c9 100644
|
| --- a/net/quic/core/quic_spdy_session.cc
|
| +++ b/net/quic/core/quic_spdy_session.cc
|
| @@ -124,7 +124,8 @@ class QuicSpdySession::SpdyFramerVisitor
|
| if (session_->OnStreamFrameData(stream_id, data, len)) {
|
| return;
|
| }
|
| - CloseConnection("SPDY DATA frame received.");
|
| + CloseConnection("SPDY DATA frame received.",
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| }
|
|
|
| void OnStreamEnd(SpdyStreamId stream_id) override {
|
| @@ -133,13 +134,23 @@ class QuicSpdySession::SpdyFramerVisitor
|
| }
|
|
|
| void OnStreamPadding(SpdyStreamId stream_id, size_t len) override {
|
| - CloseConnection("SPDY frame padding received.");
|
| + CloseConnection("SPDY frame padding received.",
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| }
|
|
|
| void OnError(SpdyFramer* framer) override {
|
| - CloseConnection(QuicStrCat(
|
| - "SPDY framing error: ",
|
| - SpdyFramer::SpdyFramerErrorToString(framer->spdy_framer_error())));
|
| + QuicErrorCode code = QUIC_INVALID_HEADERS_STREAM_DATA;
|
| + SpdyFramer::SpdyFramerError error = framer->spdy_framer_error();
|
| + switch (error) {
|
| + case SpdyFramer::SpdyFramerError::SPDY_DECOMPRESS_FAILURE:
|
| + code = QUIC_HEADERS_STREAM_DATA_DECOMPRESS_FAILURE;
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + CloseConnection(QuicStrCat("SPDY framing error: ",
|
| + SpdyFramer::SpdyFramerErrorToString(error)),
|
| + code);
|
| }
|
|
|
| void OnDataFrameHeader(SpdyStreamId stream_id,
|
| @@ -148,16 +159,19 @@ class QuicSpdySession::SpdyFramerVisitor
|
| if (session_->OnDataFrameHeader(stream_id, length, fin)) {
|
| return;
|
| }
|
| - CloseConnection("SPDY DATA frame received.");
|
| + CloseConnection("SPDY DATA frame received.",
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| }
|
|
|
| void OnRstStream(SpdyStreamId stream_id, SpdyErrorCode error_code) override {
|
| - CloseConnection("SPDY RST_STREAM frame received.");
|
| + CloseConnection("SPDY RST_STREAM frame received.",
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| }
|
|
|
| void OnSetting(SpdySettingsIds id, uint32_t value) override {
|
| if (!FLAGS_quic_reloadable_flag_quic_respect_http2_settings_frame) {
|
| - CloseConnection("SPDY SETTINGS frame received.");
|
| + CloseConnection("SPDY SETTINGS frame received.",
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| return;
|
| }
|
| switch (id) {
|
| @@ -170,14 +184,16 @@ class QuicSpdySession::SpdyFramerVisitor
|
| // See rfc7540, Section 6.5.2.
|
| if (value > 1) {
|
| CloseConnection(
|
| - QuicStrCat("Invalid value for SETTINGS_ENABLE_PUSH: ", value));
|
| + QuicStrCat("Invalid value for SETTINGS_ENABLE_PUSH: ", value),
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| return;
|
| }
|
| session_->UpdateEnableServerPush(value > 0);
|
| break;
|
| } else {
|
| CloseConnection(
|
| - QuicStrCat("Unsupported field of HTTP/2 SETTINGS frame: ", id));
|
| + QuicStrCat("Unsupported field of HTTP/2 SETTINGS frame: ", id),
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| }
|
| break;
|
| // TODO(fayang): Need to support SETTINGS_MAX_HEADER_LIST_SIZE when
|
| @@ -188,29 +204,34 @@ class QuicSpdySession::SpdyFramerVisitor
|
| }
|
| default:
|
| CloseConnection(
|
| - QuicStrCat("Unsupported field of HTTP/2 SETTINGS frame: ", id));
|
| + QuicStrCat("Unsupported field of HTTP/2 SETTINGS frame: ", id),
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| }
|
| }
|
|
|
| void OnSettingsAck() override {
|
| if (!FLAGS_quic_reloadable_flag_quic_respect_http2_settings_frame) {
|
| - CloseConnection("SPDY SETTINGS frame received.");
|
| + CloseConnection("SPDY SETTINGS frame received.",
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| }
|
| }
|
|
|
| void OnSettingsEnd() override {
|
| if (!FLAGS_quic_reloadable_flag_quic_respect_http2_settings_frame) {
|
| - CloseConnection("SPDY SETTINGS frame received.");
|
| + CloseConnection("SPDY SETTINGS frame received.",
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| }
|
| }
|
|
|
| void OnPing(SpdyPingId unique_id, bool is_ack) override {
|
| - CloseConnection("SPDY PING frame received.");
|
| + CloseConnection("SPDY PING frame received.",
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| }
|
|
|
| void OnGoAway(SpdyStreamId last_accepted_stream_id,
|
| SpdyErrorCode error_code) override {
|
| - CloseConnection("SPDY GOAWAY frame received.");
|
| + CloseConnection("SPDY GOAWAY frame received.",
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| }
|
|
|
| void OnHeaders(SpdyStreamId stream_id,
|
| @@ -232,14 +253,16 @@ class QuicSpdySession::SpdyFramerVisitor
|
| }
|
|
|
| void OnWindowUpdate(SpdyStreamId stream_id, int delta_window_size) override {
|
| - CloseConnection("SPDY WINDOW_UPDATE frame received.");
|
| + CloseConnection("SPDY WINDOW_UPDATE frame received.",
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| }
|
|
|
| void OnPushPromise(SpdyStreamId stream_id,
|
| SpdyStreamId promised_stream_id,
|
| bool end) override {
|
| if (!session_->supports_push_promise()) {
|
| - CloseConnection("PUSH_PROMISE not supported.");
|
| + CloseConnection("PUSH_PROMISE not supported.",
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| return;
|
| }
|
| if (!session_->IsConnected()) {
|
| @@ -254,11 +277,13 @@ class QuicSpdySession::SpdyFramerVisitor
|
| SpdyStreamId parent_id,
|
| int weight,
|
| bool exclusive) override {
|
| - CloseConnection("SPDY PRIORITY frame received.");
|
| + CloseConnection("SPDY PRIORITY frame received.",
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| }
|
|
|
| bool OnUnknownFrame(SpdyStreamId stream_id, uint8_t frame_type) override {
|
| - CloseConnection("Unknown frame type received.");
|
| + CloseConnection("Unknown frame type received.",
|
| + QUIC_INVALID_HEADERS_STREAM_DATA);
|
| return false;
|
| }
|
|
|
| @@ -290,10 +315,9 @@ class QuicSpdySession::SpdyFramerVisitor
|
| }
|
|
|
| private:
|
| - void CloseConnection(const string& details) {
|
| + void CloseConnection(const string& details, QuicErrorCode code) {
|
| if (session_->IsConnected()) {
|
| - session_->CloseConnectionWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA,
|
| - details);
|
| + session_->CloseConnectionWithDetails(code, details);
|
| }
|
| }
|
|
|
|
|