blob: 4e655329b5f5af05dd6224f1048cf1548310c047 [file] [log] [blame]
// 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.
#ifndef QUICHE_QUIC_CORE_QPACK_QPACK_ENCODER_H_
#define QUICHE_QUIC_CORE_QPACK_QPACK_ENCODER_H_
#include <cstdint>
#include <memory>
#include "net/third_party/quiche/src/quic/core/qpack/qpack_decoder_stream_receiver.h"
#include "net/third_party/quiche/src/quic/core/qpack/qpack_encoder_stream_sender.h"
#include "net/third_party/quiche/src/quic/core/qpack/qpack_header_table.h"
#include "net/third_party/quiche/src/quic/core/quic_types.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
#include "net/third_party/quiche/src/spdy/core/hpack/hpack_encoder.h"
namespace spdy {
class SpdyHeaderBlock;
}
namespace quic {
// QPACK encoder class. Exactly one instance should exist per QUIC connection.
// This class vends a new QpackProgressiveEncoder instance for each new header
// list to be encoded.
class QUIC_EXPORT_PRIVATE QpackEncoder
: public QpackDecoderStreamReceiver::Delegate {
public:
// Interface for receiving notification that an error has occurred on the
// decoder stream. This MUST be treated as a connection error of type
// HTTP_QPACK_DECODER_STREAM_ERROR.
class QUIC_EXPORT_PRIVATE DecoderStreamErrorDelegate {
public:
virtual ~DecoderStreamErrorDelegate() {}
virtual void OnDecoderStreamError(QuicStringPiece error_message) = 0;
};
QpackEncoder(
DecoderStreamErrorDelegate* decoder_stream_error_delegate,
QpackEncoderStreamSender::Delegate* encoder_stream_sender_delegate);
~QpackEncoder() override;
// This factory method is called to start encoding a header list.
// |*header_list| must remain valid and must not change
// during the lifetime of the returned ProgressiveEncoder instance.
std::unique_ptr<spdy::HpackEncoder::ProgressiveEncoder> EncodeHeaderList(
QuicStreamId stream_id,
const spdy::SpdyHeaderBlock* header_list);
// Decode data received on the decoder stream.
void DecodeDecoderStreamData(QuicStringPiece data);
// QpackDecoderStreamReceiver::Delegate implementation
void OnInsertCountIncrement(uint64_t increment) override;
void OnHeaderAcknowledgement(QuicStreamId stream_id) override;
void OnStreamCancellation(QuicStreamId stream_id) override;
void OnErrorDetected(QuicStringPiece error_message) override;
private:
DecoderStreamErrorDelegate* const decoder_stream_error_delegate_;
QpackDecoderStreamReceiver decoder_stream_receiver_;
QpackEncoderStreamSender encoder_stream_sender_;
QpackHeaderTable header_table_;
};
} // namespace quic
#endif // QUICHE_QUIC_CORE_QPACK_QPACK_ENCODER_H_