courierust 1.0.0

no_std HTTP and gRPC engine with work-stealing, RFC 9218, and JA3/JA4 fingerprinting.
Documentation
# GitHub Action Benchmark


Generated by the benchmark workflow.

## Run


- Commit: 39b2ad41434cd0e6dd981187e5b896e2577a29d1
- Ref: main
- Runner: Linux
- Throughput exit code: 0
- Comparison exit code: 0
- Concurrency exit code: 0
- Interop exit code: 0
- Cross-machine exit code: not-configured
- Fuzz exit code: 0
- Workflow run: [32513065262]https://github.com/blueokanna/Courierust/actions/runs/32513065262

## Evidence Rules


- Rows marked `invalid` are retained for auditability but are excluded from performance conclusions.
- Reqwest blocking + h2c + 64 KiB is intentionally invalid: the observed fixed ~41 ms wait is a harness/configuration artifact, not proof of either peer performance.
- Loopback is not cross-machine evidence. The cross-machine table is evidence only when `target_scope=remote` and `status=ok`.
- TLS rows measure the built-in TLS 1.3 path; certificate, hostname, and ALPN checks must pass for the case to be valid.
- Fuzz status is evidence only for the recorded target, run count, and duration; an unconfigured target is not a pass.

## Throughput


| Case | Protocol | Mode | Payload | Workers | Server threads | Requests | RPS | Resp MB/s | P50 us | P75 us | P90 us | P95 us | P99 us | Samples |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| h1_sequential | h1 | sequential | empty | 1 | 4 | 4000 | 17501.3 | 0.000 | 55.15 | 64.31 | 72.68 | 76.03 | 87.77 | 2000 |
| h1_sequential | h1 | sequential | 1k | 1 | 4 | 4000 | 16833.4 | 17.237 | 58.02 | 66.08 | 75.36 | 81.16 | 90.09 | 2000 |
| h1_sequential | h1 | sequential | 64k | 1 | 4 | 4000 | 12132.5 | 795.118 | 83.15 | 91.49 | 99.67 | 105.64 | 117.69 | 2000 |
| h1_parallel_w1 | h1 | parallel | 1k | 1 | 4 | 4000 | 17335.2 | 17.751 | 56.06 | 64.73 | 72.91 | 78.43 | 87.35 | 2000 |
| h1_parallel_w4 | h1 | parallel | 1k | 4 | 4 | 4000 | 49188.1 | 50.369 | 70.12 | 88.40 | 109.01 | 123.68 | 167.88 | 2000 |
| h1_parallel_w8 | h1 | parallel | 1k | 8 | 8 | 4000 | 79553.7 | 81.463 | 77.00 | 106.90 | 140.88 | 167.58 | 226.60 | 2000 |
| h2_multiplex_w1 | h2c | multiplex | 1k | 1 | 4 | 4000 | 14470.4 | 14.818 | 67.47 | 73.34 | 81.35 | 86.54 | 97.09 | 2000 |
| h2_multiplex_w8 | h2c | multiplex | 1k | 8 | 4 | 4000 | 48360.5 | 49.521 | 149.52 | 179.17 | 227.06 | 250.03 | 303.01 | 2000 |
| h2_multiplex_w32 | h2c | multiplex | 1k | 32 | 4 | 4000 | 74335.9 | 76.120 | 419.51 | 438.13 | 468.85 | 497.96 | 730.79 | 2016 |
| h2_multiplex_w1 | h2c | multiplex | 64k | 1 | 4 | 4000 | 9411.9 | 616.821 | 104.49 | 109.59 | 116.30 | 121.03 | 138.88 | 2000 |
| h2_multiplex_w8 | h2c | multiplex | 64k | 8 | 4 | 4000 | 16197.7 | 1061.533 | 510.30 | 561.97 | 610.63 | 637.33 | 792.88 | 2000 |
| h2_multiplex_w32 | h2c | multiplex | 64k | 32 | 4 | 4000 | 6403.3 | 419.648 | 1595.95 | 1690.45 | 1867.34 | 2084.30 | 4870.48 | 2016 |
| https_h2_sequential | https+h2 | sequential | empty | 1 | 4 | 2000 | 14157.7 | 0.000 | 70.73 | 73.16 | 76.44 | 78.16 | 87.00 | 2000 |
| https_h2_sequential | https+h2 | sequential | 1k | 1 | 4 | 2000 | 12739.9 | 13.046 | 77.97 | 82.82 | 85.62 | 90.68 | 103.08 | 2000 |
| https_h2_sequential | https+h2 | sequential | 64k | 1 | 4 | 2000 | 2653.9 | 173.924 | 373.19 | 386.36 | 407.33 | 420.40 | 435.57 | 2000 |

## Cross-Library Comparison


| Case | Layer | Protocol | Client | Server | Payload | Workers | Server threads | Pool policy | Pool value | Reps | Status | Reason | Requests | RPS | Resp MB/s | P50 us | P75 us | P90 us | P95 us | P99 us | Samples |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| raw_tcp_floor | transport | h1 | std_tcp | std_tcp | 4b | 1 | 1 | raw_tcp | 1 | 1 | valid | - | 2000 | 31842.6 | 0.127 | 30.51 | 32.39 | 35.03 | 36.41 | 44.59 | 2000 |
| courierust_client_to_hyper | client | h1 | courierust | hyper | 1k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 26013.0 | 26.637 | 38.73 | 40.88 | 46.30 | 48.66 | 60.77 | 4000 |
| reqwest_client_to_hyper | client | h1 | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 12153.7 | 12.445 | 80.64 | 86.50 | 93.13 | 97.88 | 109.31 | 4000 |
| reqwest_client_to_courierust | server | h1 | reqwest | courierust | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 9211.3 | 9.432 | 107.54 | 115.85 | 124.11 | 128.61 | 138.79 | 4000 |
| reqwest_client_to_hyper | server | h1 | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 12125.0 | 12.416 | 80.16 | 86.46 | 94.80 | 99.42 | 108.36 | 4000 |
| courierust_client_to_hyper | client | h1 | courierust | hyper | 1k | 8 | 4 | courierust_max_connections_per_host | 8 | 2 | valid | - | 4000 | 113379.6 | 116.101 | 58.65 | 82.83 | 101.84 | 116.65 | 187.61 | 4000 |
| reqwest_client_to_hyper | client | h1 | reqwest | hyper | 1k | 8 | 4 | reqwest_pool_max_idle_per_host | 8 | 2 | valid | - | 4000 | 35662.6 | 36.518 | 217.73 | 235.35 | 257.42 | 274.35 | 331.43 | 4000 |
| courierust_client_to_hyper | client | h1 | courierust | hyper | 64k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 20317.2 | 1331.509 | 46.62 | 54.38 | 59.67 | 63.94 | 76.10 | 4000 |
| reqwest_client_to_hyper | client | h1 | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 11491.9 | 753.136 | 81.17 | 95.80 | 105.35 | 112.16 | 126.49 | 4000 |
| reqwest_client_to_courierust | server | h1 | reqwest | courierust | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 8032.5 | 526.420 | 123.13 | 132.29 | 141.72 | 147.37 | 165.01 | 4000 |
| reqwest_client_to_hyper | server | h1 | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 10506.0 | 688.521 | 92.27 | 98.16 | 104.77 | 111.98 | 145.02 | 4000 |
| courierust_client_to_hyper | client | h2c | courierust | hyper | 1k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 12463.1 | 12.762 | 78.50 | 84.37 | 92.49 | 96.98 | 106.75 | 4000 |
| reqwest_client_to_hyper | client | h2c | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 11299.3 | 11.570 | 86.87 | 90.76 | 95.97 | 102.79 | 115.80 | 4000 |
| reqwest_client_to_courierust | server | h2c | reqwest | courierust | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 11481.2 | 11.757 | 81.82 | 90.51 | 106.12 | 115.97 | 132.29 | 4000 |
| reqwest_client_to_hyper | server | h2c | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 10826.3 | 11.086 | 90.08 | 101.50 | 110.09 | 118.35 | 135.03 | 4000 |
| courierust_client_to_hyper | client | h2c | courierust | hyper | 1k | 8 | 4 | courierust_max_connections_per_host | 8 | 2 | valid | - | 4000 | 32963.4 | 33.755 | 111.33 | 145.98 | 186.63 | 220.01 | 360.18 | 4000 |
| reqwest_client_to_hyper | client | h2c | reqwest | hyper | 1k | 8 | 4 | reqwest_pool_max_idle_per_host | 8 | 2 | valid | - | 4000 | 16576.5 | 16.974 | 229.14 | 260.46 | 297.14 | 329.42 | 418.56 | 4000 |
| courierust_client_to_hyper | client | h2c | courierust | hyper | 64k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 4331.5 | 283.872 | 127.75 | 136.24 | 145.03 | 151.25 | 176.43 | 4000 |
| reqwest_client_to_hyper | client | h2c | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | invalid | reqwest_blocking_h2c_64k_fixed_wait_not_performance_evidence | 4000 | 24.4 | 1.601 | 40999.34 | 41053.63 | 41138.35 | 41191.27 | 41324.32 | 4000 |
| reqwest_client_to_courierust | server | h2c | reqwest | courierust | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | invalid | reqwest_blocking_h2c_64k_fixed_wait_not_performance_evidence | 4000 | 9205.4 | 603.288 | 106.07 | 113.45 | 121.36 | 126.40 | 138.81 | 4000 |
| reqwest_client_to_hyper | server | h2c | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | invalid | reqwest_blocking_h2c_64k_fixed_wait_not_performance_evidence | 4000 | 24.4 | 1.601 | 40998.42 | 41052.14 | 41138.05 | 41184.70 | 41310.43 | 4000 |

## Concurrency and Slow Connections


| Case | Model | Platform | Status | Event enabled | Connections | Worker threads | Probe us | Completed | Wall ms |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| idle_partial_herd | event | linux | probe_ok | true | 200 | 2 | 236.43 | - | - |
| idle_partial_herd | pool | linux | probe_blocked | false | 200 | 2 | na | - | - |
| slow_sender_herd | event | linux | ok | true | 16 | 2 | - | 16 | 1.01 |

## Cross-Machine


| Role | Status | Scope | Protocol | Workers | Max connections | Requests | Bytes | RPS | Resp MB/s | P50 us | P95 us | P99 us | Samples | Reason |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| client | not_configured | remote | - | - | - | - | - | - | - | - | - | - | - | COURIERUST_REMOTE_URL_not_set |

## Fuzz


| Target | Status | Runs | Duration s | Corpus | Reason |
| --- | --- | --- | --- | --- | --- |
| h2_frame | ok | 20000 | 31 | fuzz/corpus/h2_frame | command_exit_0 |
| hpack_block | ok | 20000 | 3 | fuzz/corpus/hpack_block | command_exit_0 |
| h1_request | ok | 20000 | 0 | fuzz/corpus/h1_request | command_exit_0 |
| h2_connection | ok | 20000 | 8 | fuzz/corpus/h2_connection | command_exit_0 |

## Interop Validation


| Case | Result |
| --- | --- |
| courierust_client_h1_to_hyper_h1 | ok |
| courierust_client_h2c_to_hyper_h2 | ok |
| hyper_client_h1_to_courierust_h1 | ok |
| hyper_client_h2c_to_courierust_h2 | ok |
| reqwest_h1_to_courierust_h1 | ok |
| reqwest_h2c_to_courierust_h2 | ok |
| courierust_h2c_large_body_to_hyper_h2 | ok |
| courierust_h1_slow_reader_to_hyper_h1 | ok |
| suite | all_cases_passed |

## Captured Benchmark Output


### Throughput

~~~text
courierust throughput suite (loopback)
META|suite=throughput|requests=4000|server_threads=4|max_samples=2048
RESULT|suite=throughput|case=h1_sequential|protocol=h1|mode=sequential|payload=empty|bytes=0|workers=1|server_threads=4|requests=4000|elapsed_ms=228.554|rps=17501.3|response_mbps=0.000|p50_us=55.15|p75_us=64.31|p90_us=72.68|p95_us=76.03|p99_us=87.77|samples=2000
RESULT|suite=throughput|case=h1_sequential|protocol=h1|mode=sequential|payload=1k|bytes=1024|workers=1|server_threads=4|requests=4000|elapsed_ms=237.623|rps=16833.4|response_mbps=17.237|p50_us=58.02|p75_us=66.08|p90_us=75.36|p95_us=81.16|p99_us=90.09|samples=2000
RESULT|suite=throughput|case=h1_sequential|protocol=h1|mode=sequential|payload=64k|bytes=65536|workers=1|server_threads=4|requests=4000|elapsed_ms=329.692|rps=12132.5|response_mbps=795.118|p50_us=83.15|p75_us=91.49|p90_us=99.67|p95_us=105.64|p99_us=117.69|samples=2000
RESULT|suite=throughput|case=h1_parallel_w1|protocol=h1|mode=parallel|payload=1k|bytes=1024|workers=1|server_threads=4|requests=4000|elapsed_ms=230.745|rps=17335.2|response_mbps=17.751|p50_us=56.06|p75_us=64.73|p90_us=72.91|p95_us=78.43|p99_us=87.35|samples=2000
RESULT|suite=throughput|case=h1_parallel_w4|protocol=h1|mode=parallel|payload=1k|bytes=1024|workers=4|server_threads=4|requests=4000|elapsed_ms=81.320|rps=49188.1|response_mbps=50.369|p50_us=70.12|p75_us=88.40|p90_us=109.01|p95_us=123.68|p99_us=167.88|samples=2000
RESULT|suite=throughput|case=h1_parallel_w8|protocol=h1|mode=parallel|payload=1k|bytes=1024|workers=8|server_threads=8|requests=4000|elapsed_ms=50.281|rps=79553.7|response_mbps=81.463|p50_us=77.00|p75_us=106.90|p90_us=140.88|p95_us=167.58|p99_us=226.60|samples=2000
RESULT|suite=throughput|case=h2_multiplex_w1|protocol=h2c|mode=multiplex|payload=1k|bytes=1024|workers=1|server_threads=4|requests=4000|elapsed_ms=276.426|rps=14470.4|response_mbps=14.818|p50_us=67.47|p75_us=73.34|p90_us=81.35|p95_us=86.54|p99_us=97.09|samples=2000
RESULT|suite=throughput|case=h2_multiplex_w8|protocol=h2c|mode=multiplex|payload=1k|bytes=1024|workers=8|server_threads=4|requests=4000|elapsed_ms=82.712|rps=48360.5|response_mbps=49.521|p50_us=149.52|p75_us=179.17|p90_us=227.06|p95_us=250.03|p99_us=303.01|samples=2000
RESULT|suite=throughput|case=h2_multiplex_w32|protocol=h2c|mode=multiplex|payload=1k|bytes=1024|workers=32|server_threads=4|requests=4000|elapsed_ms=53.810|rps=74335.9|response_mbps=76.120|p50_us=419.51|p75_us=438.13|p90_us=468.85|p95_us=497.96|p99_us=730.79|samples=2016
RESULT|suite=throughput|case=h2_multiplex_w1|protocol=h2c|mode=multiplex|payload=64k|bytes=65536|workers=1|server_threads=4|requests=4000|elapsed_ms=424.992|rps=9411.9|response_mbps=616.821|p50_us=104.49|p75_us=109.59|p90_us=116.30|p95_us=121.03|p99_us=138.88|samples=2000
RESULT|suite=throughput|case=h2_multiplex_w8|protocol=h2c|mode=multiplex|payload=64k|bytes=65536|workers=8|server_threads=4|requests=4000|elapsed_ms=246.949|rps=16197.7|response_mbps=1061.533|p50_us=510.30|p75_us=561.97|p90_us=610.63|p95_us=637.33|p99_us=792.88|samples=2000
RESULT|suite=throughput|case=h2_multiplex_w32|protocol=h2c|mode=multiplex|payload=64k|bytes=65536|workers=32|server_threads=4|requests=4000|elapsed_ms=624.675|rps=6403.3|response_mbps=419.648|p50_us=1595.95|p75_us=1690.45|p90_us=1867.34|p95_us=2084.30|p99_us=4870.48|samples=2016
RESULT|suite=throughput|case=https_h2_sequential|protocol=https+h2|mode=sequential|payload=empty|bytes=0|workers=1|server_threads=4|requests=2000|elapsed_ms=141.265|rps=14157.7|response_mbps=0.000|p50_us=70.73|p75_us=73.16|p90_us=76.44|p95_us=78.16|p99_us=87.00|samples=2000
RESULT|suite=throughput|case=https_h2_sequential|protocol=https+h2|mode=sequential|payload=1k|bytes=1024|workers=1|server_threads=4|requests=2000|elapsed_ms=156.987|rps=12739.9|response_mbps=13.046|p50_us=77.97|p75_us=82.82|p90_us=85.62|p95_us=90.68|p99_us=103.08|samples=2000
RESULT|suite=throughput|case=https_h2_sequential|protocol=https+h2|mode=sequential|payload=64k|bytes=65536|workers=1|server_threads=4|requests=2000|elapsed_ms=753.617|rps=2653.9|response_mbps=173.924|p50_us=373.19|p75_us=386.36|p90_us=407.33|p95_us=420.40|p99_us=435.57|samples=2000
total: complete
~~~

### Cross-Library Comparison
~~~text
courierust comparison suite (loopback, shared-peer matrix)
META|suite=compare|requests_per_repetition=2000|parallel_requests_per_repetition=2000|parallel_workers=8|repetitions=2|max_samples=2048
RESULT|suite=compare|case=raw_tcp_floor|layer=transport|protocol=h1|client=std_tcp|server=std_tcp|payload=4b|bytes=4|workers=1|server_threads=1|pool_policy=raw_tcp|pool_value=1|repetitions=1|status=valid|reason=-|requests=2000|elapsed_ms=62.809|rps=31842.6|response_mbps=0.127|p50_us=30.51|p75_us=32.39|p90_us=35.03|p95_us=36.41|p99_us=44.59|samples=2000
RESULT|suite=compare|case=courierust_client_to_hyper|layer=client|protocol=h1|client=courierust|server=hyper|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=153.769|rps=26013.0|response_mbps=26.637|p50_us=38.73|p75_us=40.88|p90_us=46.30|p95_us=48.66|p99_us=60.77|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=client|protocol=h1|client=reqwest|server=hyper|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=329.118|rps=12153.7|response_mbps=12.445|p50_us=80.64|p75_us=86.50|p90_us=93.13|p95_us=97.88|p99_us=109.31|samples=4000
RESULT|suite=compare|case=reqwest_client_to_courierust|layer=server|protocol=h1|client=reqwest|server=courierust|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=434.247|rps=9211.3|response_mbps=9.432|p50_us=107.54|p75_us=115.85|p90_us=124.11|p95_us=128.61|p99_us=138.79|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=server|protocol=h1|client=reqwest|server=hyper|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=329.896|rps=12125.0|response_mbps=12.416|p50_us=80.16|p75_us=86.46|p90_us=94.80|p95_us=99.42|p99_us=108.36|samples=4000
RESULT|suite=compare|case=courierust_client_to_hyper|layer=client|protocol=h1|client=courierust|server=hyper|payload=1k|bytes=1024|workers=8|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=8|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=35.280|rps=113379.6|response_mbps=116.101|p50_us=58.65|p75_us=82.83|p90_us=101.84|p95_us=116.65|p99_us=187.61|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=client|protocol=h1|client=reqwest|server=hyper|payload=1k|bytes=1024|workers=8|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=8|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=112.162|rps=35662.6|response_mbps=36.518|p50_us=217.73|p75_us=235.35|p90_us=257.42|p95_us=274.35|p99_us=331.43|samples=4000
RESULT|suite=compare|case=courierust_client_to_hyper|layer=client|protocol=h1|client=courierust|server=hyper|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=196.877|rps=20317.2|response_mbps=1331.509|p50_us=46.62|p75_us=54.38|p90_us=59.67|p95_us=63.94|p99_us=76.10|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=client|protocol=h1|client=reqwest|server=hyper|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=348.070|rps=11491.9|response_mbps=753.136|p50_us=81.17|p75_us=95.80|p90_us=105.35|p95_us=112.16|p99_us=126.49|samples=4000
RESULT|suite=compare|case=reqwest_client_to_courierust|layer=server|protocol=h1|client=reqwest|server=courierust|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=497.975|rps=8032.5|response_mbps=526.420|p50_us=123.13|p75_us=132.29|p90_us=141.72|p95_us=147.37|p99_us=165.01|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=server|protocol=h1|client=reqwest|server=hyper|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=380.735|rps=10506.0|response_mbps=688.521|p50_us=92.27|p75_us=98.16|p90_us=104.77|p95_us=111.98|p99_us=145.02|samples=4000
RESULT|suite=compare|case=courierust_client_to_hyper|layer=client|protocol=h2c|client=courierust|server=hyper|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=320.948|rps=12463.1|response_mbps=12.762|p50_us=78.50|p75_us=84.37|p90_us=92.49|p95_us=96.98|p99_us=106.75|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=client|protocol=h2c|client=reqwest|server=hyper|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=354.004|rps=11299.3|response_mbps=11.570|p50_us=86.87|p75_us=90.76|p90_us=95.97|p95_us=102.79|p99_us=115.80|samples=4000
RESULT|suite=compare|case=reqwest_client_to_courierust|layer=server|protocol=h2c|client=reqwest|server=courierust|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=348.396|rps=11481.2|response_mbps=11.757|p50_us=81.82|p75_us=90.51|p90_us=106.12|p95_us=115.97|p99_us=132.29|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=server|protocol=h2c|client=reqwest|server=hyper|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=369.472|rps=10826.3|response_mbps=11.086|p50_us=90.08|p75_us=101.50|p90_us=110.09|p95_us=118.35|p99_us=135.03|samples=4000
RESULT|suite=compare|case=courierust_client_to_hyper|layer=client|protocol=h2c|client=courierust|server=hyper|payload=1k|bytes=1024|workers=8|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=8|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=121.347|rps=32963.4|response_mbps=33.755|p50_us=111.33|p75_us=145.98|p90_us=186.63|p95_us=220.01|p99_us=360.18|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=client|protocol=h2c|client=reqwest|server=hyper|payload=1k|bytes=1024|workers=8|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=8|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=241.305|rps=16576.5|response_mbps=16.974|p50_us=229.14|p75_us=260.46|p90_us=297.14|p95_us=329.42|p99_us=418.56|samples=4000
RESULT|suite=compare|case=courierust_client_to_hyper|layer=client|protocol=h2c|client=courierust|server=hyper|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=923.458|rps=4331.5|response_mbps=283.872|p50_us=127.75|p75_us=136.24|p90_us=145.03|p95_us=151.25|p99_us=176.43|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=client|protocol=h2c|client=reqwest|server=hyper|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=invalid|reason=reqwest_blocking_h2c_64k_fixed_wait_not_performance_evidence|requests=4000|elapsed_ms=163724.941|rps=24.4|response_mbps=1.601|p50_us=40999.34|p75_us=41053.63|p90_us=41138.35|p95_us=41191.27|p99_us=41324.32|samples=4000
RESULT|suite=compare|case=reqwest_client_to_courierust|layer=server|protocol=h2c|client=reqwest|server=courierust|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=invalid|reason=reqwest_blocking_h2c_64k_fixed_wait_not_performance_evidence|requests=4000|elapsed_ms=434.525|rps=9205.4|response_mbps=603.288|p50_us=106.07|p75_us=113.45|p90_us=121.36|p95_us=126.40|p99_us=138.81|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=server|protocol=h2c|client=reqwest|server=hyper|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=invalid|reason=reqwest_blocking_h2c_64k_fixed_wait_not_performance_evidence|requests=4000|elapsed_ms=163721.738|rps=24.4|response_mbps=1.601|p50_us=40998.42|p75_us=41052.14|p90_us=41138.05|p95_us=41184.70|p99_us=41310.43|samples=4000
total: complete
~~~

### Concurrency

~~~text
CONCURRENCY|case=idle_partial_herd|model=event|platform=linux|status=probe_ok|event_enabled=true|connections=200|worker_threads=2|probe_us=236.43
CONCURRENCY|case=idle_partial_herd|model=pool|platform=linux|status=probe_blocked|event_enabled=false|connections=200|worker_threads=2|probe_us=na|error=read: Resource temporarily unavailable (os error 11)
CONCURRENCY|case=slow_sender_herd|model=event|platform=linux|status=ok|event_enabled=true|connections=16|worker_threads=2|completed=16|wall_ms=1.01
CONCURRENCY|suite=complete
~~~

### Cross-Machine
~~~text
NETWORK|role=client|status=not_configured|target_scope=remote|reason=COURIERUST_REMOTE_URL_not_set
~~~

### Fuzz

~~~text
FUZZ|target=h2_frame|status=ok|runs=20000|duration_s=31|corpus=fuzz/corpus/h2_frame|reason=command_exit_0
FUZZ|target=hpack_block|status=ok|runs=20000|duration_s=3|corpus=fuzz/corpus/hpack_block|reason=command_exit_0
FUZZ|target=h1_request|status=ok|runs=20000|duration_s=0|corpus=fuzz/corpus/h1_request|reason=command_exit_0
FUZZ|target=h2_connection|status=ok|runs=20000|duration_s=8|corpus=fuzz/corpus/h2_connection|reason=command_exit_0
~~~

### Interop Validation
~~~text
courierust vs mainstream HTTP stack — interop validation
INTEROP|case=courierust_client_h1_to_hyper_h1|ok
INTEROP|case=courierust_client_h2c_to_hyper_h2|ok
INTEROP|case=hyper_client_h1_to_courierust_h1|ok
INTEROP|case=hyper_client_h2c_to_courierust_h2|ok
INTEROP|case=reqwest_h1_to_courierust_h1|ok
INTEROP|case=reqwest_h2c_to_courierust_h2|ok
INTEROP|case=courierust_h2c_large_body_to_hyper_h2|ok
INTEROP|case=courierust_h1_slow_reader_to_hyper_h1|ok
INTEROP|all_cases_passed
~~~