HeaderValidator optimizations.

Uses a bitset to represent presence or absence of various pseudoheaders. Also uses a bitset to represent certain interesting pseudoheader validation states.

Run with:

```
$ blaze run -c opt --dynamic_mode=off     //third_party/http2/adapter:header_validator_benchmark -- \
    --benchmark_filter=all
```

Before:
```
Benchmarking blaze-out/k8-opt/bin/third_party/http2/adapter/header_validator_benchmark
Run on birenroy.cam (12 X 3696 MHz CPUs); 2023-09-15T16:16:12.472977854-07:00
CPU: Intel Skylake Xeon with HyperThreading (6 cores) dL1:32KB dL2:1024KB dL3:8MB
***WARNING*** CPU scaling is enabled, the benchmark timings may be noisy, see http://go/benchmark#cpu-scaling
Benchmark                                    Time(ns)        CPU(ns)     Iterations
-----------------------------------------------------------------------------------
BM_ValidateSingleHeaderForRequests                516            516         147074
BM_ValidateSingleHeaderForRequests                526            526         147771
BM_ValidateSingleHeaderForRequests                519            519         150051
BM_ValidateSingleHeaderForRequests                525            525         149491
BM_ValidateSingleHeaderForRequests                526            527         149373
BM_ValidateSingleHeaderForRequests                522            522         151104
BM_ValidateSingleHeaderForRequests                520            520         150231
BM_ValidateSingleHeaderForRequests                522            522         151257
BM_ValidateSingleHeaderForRequests                519            519         150064
BM_ValidateSingleHeaderForRequests_mean           522            522        1346416
BM_ValidateSingleHeaderForRequests_stddev           3.32           3.35     1346416

BM_ValidateSingleHeaderForResponses               617            617          94848
BM_ValidateSingleHeaderForResponses               619            619          95237
BM_ValidateSingleHeaderForResponses               621            621          95810
BM_ValidateSingleHeaderForResponses               623            623          95445
BM_ValidateSingleHeaderForResponses               648            648          94388
BM_ValidateSingleHeaderForResponses               624            624          95060
BM_ValidateSingleHeaderForResponses               621            621          95451
BM_ValidateSingleHeaderForResponses               620            620          95311
BM_ValidateSingleHeaderForResponses               619            619          96055
BM_ValidateSingleHeaderForResponses               621            621          94617
BM_ValidateSingleHeaderForResponses               618            622          91611
BM_ValidateSingleHeaderForResponses               643            643          95116
BM_ValidateSingleHeaderForResponses_mean          624            625        1138949
BM_ValidateSingleHeaderForResponses_stddev          9.60           9.47     1138949
```

After:
```
Benchmarking blaze-out/k8-opt/bin/third_party/http2/adapter/header_validator_benchmark
Run on birenroy.cam (12 X 3696 MHz CPUs); 2023-09-15T16:04:16.120378146-07:00
CPU: Intel Skylake Xeon with HyperThreading (6 cores) dL1:32KB dL2:1024KB dL3:8MB
***WARNING*** CPU scaling is enabled, the benchmark timings may be noisy, see http://go/benchmark#cpu-scaling
Benchmark                                    Time(ns)        CPU(ns)     Iterations
-----------------------------------------------------------------------------------
BM_ValidateSingleHeaderForRequests                395            395         148667
BM_ValidateSingleHeaderForRequests                403            403         173201
BM_ValidateSingleHeaderForRequests                389            389         161670
BM_ValidateSingleHeaderForRequests                391            392         176685
BM_ValidateSingleHeaderForRequests                396            396         165624
BM_ValidateSingleHeaderForRequests                392            392         178876
BM_ValidateSingleHeaderForRequests                390            390         177580
BM_ValidateSingleHeaderForRequests                395            395         174478
BM_ValidateSingleHeaderForRequests                393            393         178706
BM_ValidateSingleHeaderForRequests                393            393         175412
BM_ValidateSingleHeaderForRequests_mean           394            394        1710899
BM_ValidateSingleHeaderForRequests_stddev           3.82           3.83     1710899

BM_ValidateSingleHeaderForResponses               586            586         133177
BM_ValidateSingleHeaderForResponses               602            602         100000
BM_ValidateSingleHeaderForResponses               595            595         100000
BM_ValidateSingleHeaderForResponses               580            580         100000
BM_ValidateSingleHeaderForResponses               582            583         100000
BM_ValidateSingleHeaderForResponses               582            582         100000
BM_ValidateSingleHeaderForResponses               587            587         100000
BM_ValidateSingleHeaderForResponses               595            595         100000
BM_ValidateSingleHeaderForResponses               585            585         100000
BM_ValidateSingleHeaderForResponses_mean          588            588         933177
BM_ValidateSingleHeaderForResponses_stddev          6.86           6.80      933177
```

PiperOrigin-RevId: 566615658
3 files changed
tree: 54a1a9e7055fe8bf0a99c75bdf94d3297681eef8
  1. build/
  2. depstool/
  3. quiche/
  4. .bazelrc
  5. BUILD.bazel
  6. CONTRIBUTING.md
  7. LICENSE
  8. README.md
  9. WHITESPACE
  10. WORKSPACE.bazel
README.md

QUICHE

QUICHE stands for QUIC, Http, Etc. It is Google‘s production-ready implementation of QUIC, HTTP/2, HTTP/3, and related protocols and tools. It powers Google’s servers, Chromium, Envoy, and other projects. It is actively developed and maintained.

There are two public QUICHE repositories. Either one may be used by embedders, as they are automatically kept in sync:

To embed QUICHE in your project, platform APIs need to be implemented and build files need to be created. Note that it is on the QUICHE team's roadmap to include default implementation for all platform APIs and to open-source build files. In the meanwhile, take a look at open source embedders like Chromium and Envoy to get started:

To contribute to QUICHE, follow instructions at CONTRIBUTING.md.

QUICHE is only supported on little-endian platforms.