blob: 1fc3d4ad8c07ea4bc173e7bc79d0994587e93669 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef QUICHE_QUIC_CORE_QPACK_OFFLINE_QPACK_OFFLINE_DECODER_H_
6#define QUICHE_QUIC_CORE_QPACK_OFFLINE_QPACK_OFFLINE_DECODER_H_
7
8#include <list>
9
10#include "net/third_party/quiche/src/quic/core/qpack/qpack_decoder.h"
11#include "net/third_party/quiche/src/quic/core/qpack/qpack_decoder_test_utils.h"
renjietangc2aa5cb2019-06-20 12:22:53 -070012#include "net/third_party/quiche/src/quic/core/qpack/qpack_utils.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050013#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
14#include "net/third_party/quiche/src/spdy/core/spdy_header_block.h"
15
16namespace quic {
17
18// A decoder to read encoded data from a file, decode it, and compare to
19// a list of expected header lists read from another file. File format is
20// described at
21// https://github.com/quicwg/base-drafts/wiki/QPACK-Offline-Interop.
22class QpackOfflineDecoder : public QpackDecoder::EncoderStreamErrorDelegate {
23 public:
24 QpackOfflineDecoder();
25 ~QpackOfflineDecoder() override = default;
26
27 // Read encoded header blocks and encoder stream data from |input_filename|
28 // and decode them, read expected header lists from
29 // |expected_headers_filename|, and compare decoded header lists to expected
30 // ones. Returns true if there is an equal number of them and the
31 // corresponding ones match, false otherwise.
32 bool DecodeAndVerifyOfflineData(QuicStringPiece input_filename,
33 QuicStringPiece expected_headers_filename);
34
35 // QpackDecoder::EncoderStreamErrorDelegate implementation:
36 void OnEncoderStreamError(QuicStringPiece error_message) override;
37
38 private:
39 // Parse decoder parameters from |input_filename| and set up |decoder_|
40 // accordingly.
41 bool ParseInputFilename(QuicStringPiece input_filename);
42
43 // Read encoded header blocks and encoder stream data from |input_filename|,
44 // pass them to |decoder_| for decoding, and add decoded header lists to
45 // |decoded_header_lists_|.
46 bool DecodeHeaderBlocksFromFile(QuicStringPiece input_filename);
47
48 // Read expected header lists from |expected_headers_filename| and verify
49 // decoded header lists in |decoded_header_lists_| against them.
50 bool VerifyDecodedHeaderLists(QuicStringPiece expected_headers_filename);
51
52 // Parse next header list from |*expected_headers_data| into
53 // |*expected_header_list|, removing consumed data from the beginning of
54 // |*expected_headers_data|. Returns true on success, false if parsing fails.
55 bool ReadNextExpectedHeaderList(QuicStringPiece* expected_headers_data,
56 spdy::SpdyHeaderBlock* expected_header_list);
57
58 // Compare two header lists. Allow for different orders of certain headers as
59 // described at
60 // https://github.com/qpackers/qifs/blob/master/encoded/qpack-03/h2o/README.md.
61 bool CompareHeaderBlocks(spdy::SpdyHeaderBlock decoded_header_list,
62 spdy::SpdyHeaderBlock expected_header_list);
63
64 bool encoder_stream_error_detected_;
renjietangc2aa5cb2019-06-20 12:22:53 -070065 NoopQpackStreamSenderDelegate decoder_stream_sender_delegate_;
QUICHE teama6ef0a62019-03-07 20:34:33 -050066 QpackDecoder decoder_;
67 std::list<spdy::SpdyHeaderBlock> decoded_header_lists_;
68};
69
70} // namespace quic
71
72#endif // QUICHE_QUIC_CORE_QPACK_OFFLINE_QPACK_OFFLINE_DECODER_H_