| 763 | } |
| 764 | |
| 765 | ssize_t HPacker::Decode(butil::IOBufBytesIterator& iter, Header* h) { |
| 766 | if (iter == NULL) { |
| 767 | return 0; |
| 768 | } |
| 769 | const uint8_t first_byte = *iter; |
| 770 | // Check the leading 4 bits to determin the entry type |
| 771 | switch (first_byte >> 4) { |
| 772 | case 15: |
| 773 | case 14: |
| 774 | case 13: |
| 775 | case 12: |
| 776 | case 11: |
| 777 | case 10: |
| 778 | case 9: |
| 779 | case 8: |
| 780 | // (1xxx) Indexed Header Field Representation |
| 781 | // https://tools.ietf.org/html/rfc7541#section-6.1 |
| 782 | { |
| 783 | int index = 0; |
| 784 | ssize_t index_bytes = DecodeInteger(iter, 7, (uint32_t*)&index); |
| 785 | if (index_bytes <= 0) { |
| 786 | return index_bytes; |
| 787 | } |
| 788 | const Header* indexed_header = HeaderAt(index); |
| 789 | if (indexed_header == NULL) { |
| 790 | LOG(ERROR) << "No header at index=" << index; |
| 791 | return -1; |
| 792 | } |
| 793 | *h = *indexed_header; |
| 794 | return index_bytes; |
| 795 | } |
| 796 | break; |
| 797 | case 7: |
| 798 | case 5: |
| 799 | case 6: |
| 800 | case 4: |
| 801 | // (01xx) Literal Header Field with Incremental Indexing |
| 802 | // https://tools.ietf.org/html/rfc7541#section-6.2.1 |
| 803 | { |
| 804 | const ssize_t bytes_consumed = DecodeWithKnownPrefix(iter, h, 6); |
| 805 | if (bytes_consumed <= 0) { |
| 806 | return -1; |
| 807 | } |
| 808 | _decode_table->AddHeader(*h); |
| 809 | return bytes_consumed; |
| 810 | } |
| 811 | break; |
| 812 | case 3: |
| 813 | case 2: |
| 814 | // (001x) Dynamic Table Size Update |
| 815 | // https://tools.ietf.org/html/rfc7541#section-6.3 |
| 816 | { |
| 817 | uint32_t max_size = 0; |
| 818 | ssize_t read_bytes = DecodeInteger(iter, 5, &max_size); |
| 819 | if (read_bytes <= 0) { |
| 820 | return read_bytes; |
| 821 | } |
| 822 | if (max_size > H2Settings::DEFAULT_HEADER_TABLE_SIZE) { |
no test coverage detected