QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 1 | // 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" |
renjietang | c2aa5cb | 2019-06-20 12:22:53 -0700 | [diff] [blame] | 12 | #include "net/third_party/quiche/src/quic/core/qpack/qpack_utils.h" |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 13 | #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 | |
| 16 | namespace 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. |
| 22 | class 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_; |
renjietang | c2aa5cb | 2019-06-20 12:22:53 -0700 | [diff] [blame] | 65 | NoopQpackStreamSenderDelegate decoder_stream_sender_delegate_; |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 66 | 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_ |