| // Copyright (c) 2018 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "net/third_party/quiche/src/quic/core/qpack/qpack_decoder_stream_receiver.h" | |
| #include "net/third_party/quiche/src/http2/decoder/decode_buffer.h" | |
| #include "net/third_party/quiche/src/http2/decoder/decode_status.h" | |
| #include "net/third_party/quiche/src/quic/core/qpack/qpack_constants.h" | |
| namespace quic { | |
| QpackDecoderStreamReceiver::QpackDecoderStreamReceiver(Delegate* delegate) | |
| : instruction_decoder_(QpackDecoderStreamLanguage(), this), | |
| delegate_(delegate), | |
| error_detected_(false) { | |
| DCHECK(delegate_); | |
| } | |
| void QpackDecoderStreamReceiver::Decode(QuicStringPiece data) { | |
| if (data.empty() || error_detected_) { | |
| return; | |
| } | |
| instruction_decoder_.Decode(data); | |
| } | |
| bool QpackDecoderStreamReceiver::OnInstructionDecoded( | |
| const QpackInstruction* instruction) { | |
| if (instruction == InsertCountIncrementInstruction()) { | |
| delegate_->OnInsertCountIncrement(instruction_decoder_.varint()); | |
| return true; | |
| } | |
| if (instruction == HeaderAcknowledgementInstruction()) { | |
| delegate_->OnHeaderAcknowledgement(instruction_decoder_.varint()); | |
| return true; | |
| } | |
| DCHECK_EQ(instruction, StreamCancellationInstruction()); | |
| delegate_->OnStreamCancellation(instruction_decoder_.varint()); | |
| return true; | |
| } | |
| void QpackDecoderStreamReceiver::OnError(QuicStringPiece error_message) { | |
| DCHECK(!error_detected_); | |
| error_detected_ = true; | |
| delegate_->OnErrorDetected(error_message); | |
| } | |
| } // namespace quic |