blob: 3f8ef08a7eeb613bf928272553cbcaf8d9164b22 [file] [log] [blame] [edit]
// 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_encoder_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 {
QpackEncoderStreamReceiver::QpackEncoderStreamReceiver(Delegate* delegate)
: instruction_decoder_(QpackEncoderStreamLanguage(), this),
delegate_(delegate),
error_detected_(false) {
DCHECK(delegate_);
}
void QpackEncoderStreamReceiver::Decode(QuicStringPiece data) {
if (data.empty() || error_detected_) {
return;
}
instruction_decoder_.Decode(data);
}
bool QpackEncoderStreamReceiver::OnInstructionDecoded(
const QpackInstruction* instruction) {
if (instruction == InsertWithNameReferenceInstruction()) {
delegate_->OnInsertWithNameReference(instruction_decoder_.s_bit(),
instruction_decoder_.varint(),
instruction_decoder_.value());
return true;
}
if (instruction == InsertWithoutNameReferenceInstruction()) {
delegate_->OnInsertWithoutNameReference(instruction_decoder_.name(),
instruction_decoder_.value());
return true;
}
if (instruction == DuplicateInstruction()) {
delegate_->OnDuplicate(instruction_decoder_.varint());
return true;
}
DCHECK_EQ(instruction, SetDynamicTableCapacityInstruction());
delegate_->OnSetDynamicTableCapacity(instruction_decoder_.varint());
return true;
}
void QpackEncoderStreamReceiver::OnError(QuicStringPiece error_message) {
DCHECK(!error_detected_);
error_detected_ = true;
delegate_->OnErrorDetected(error_message);
}
} // namespace quic