[{"data":1,"prerenderedAt":1982},["ShallowReactive",2],{"navigation":3,"/actix-web/responses":240,"/actix-web/responses-surround":1977},[4,34,66,87,106,145,166,176,204],{"title":5,"path":6,"stem":7,"children":8,"icon":32,"defaultOpen":33},"Getting Started","/getting-started","1.getting-started/1.index",[9,12,17,22,27],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-info",{"title":13,"path":14,"stem":15,"icon":16},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Quickstart (Local)","/getting-started/quickstart-local","1.getting-started/3.quickstart-local","i-lucide-zap",{"title":23,"path":24,"stem":25,"icon":26},"Quickstart (Redis)","/getting-started/quickstart-redis","1.getting-started/4.quickstart-redis","i-lucide-database",{"title":28,"path":29,"stem":30,"icon":31},"Quickstart (Hybrid)","/getting-started/quickstart-hybrid","1.getting-started/5.quickstart-hybrid","i-lucide-arrow-left-right","i-lucide-rocket",true,{"title":35,"icon":36,"defaultOpen":33,"path":37,"stem":38,"children":39,"page":65},"Concepts","i-lucide-lightbulb","/concepts","2.concepts",[40,45,50,55,60],{"title":41,"path":42,"stem":43,"icon":44},"Keys","/concepts/keys","2.concepts/1.keys","i-lucide-key-round",{"title":46,"path":47,"stem":48,"icon":49},"Rate Limits","/concepts/rate-limits","2.concepts/2.rate-limits","i-lucide-badge-percent",{"title":51,"path":52,"stem":53,"icon":54},"Sliding Windows","/concepts/sliding-windows","2.concepts/3.sliding-windows","i-lucide-timer-reset",{"title":56,"path":57,"stem":58,"icon":59},"Decisions","/concepts/decisions","2.concepts/4.decisions","i-lucide-check-check",{"title":61,"path":62,"stem":63,"icon":64},"Configuration Types","/concepts/configuration-types","2.concepts/5.configuration-types","i-lucide-box",false,{"title":67,"icon":68,"defaultOpen":33,"path":69,"stem":70,"children":71,"page":65},"Strategies","i-lucide-git-branch","/strategies","3.strategies",[72,77,82],{"title":73,"path":74,"stem":75,"icon":76},"Absolute","/strategies/absolute","3.strategies/1.absolute","i-lucide-shield",{"title":78,"path":79,"stem":80,"icon":81},"Suppressed","/strategies/suppressed","3.strategies/2.suppressed","i-lucide-activity",{"title":83,"path":84,"stem":85,"icon":86},"How Suppression Works","/strategies/how-suppression-works","3.strategies/3.how-suppression-works","i-lucide-function-square",{"title":88,"icon":89,"defaultOpen":33,"path":90,"stem":91,"children":92,"page":65},"Providers","i-lucide-layers","/providers","4.providers",[93,98,102],{"title":94,"path":95,"stem":96,"icon":97},"Local","/providers/local","4.providers/1.local","i-lucide-cpu",{"title":99,"path":100,"stem":101,"icon":26},"Redis","/providers/redis","4.providers/2.redis",{"title":103,"path":104,"stem":105,"icon":31},"Hybrid","/providers/hybrid","4.providers/3.hybrid",{"title":107,"path":108,"stem":109,"children":110,"icon":76,"defaultOpen":65},"Actix Web","/actix-web","5.actix-web/1.index",[111,113,118,122,127,131,136,140],{"title":112,"path":108,"stem":109,"icon":76},"Overview",{"title":114,"path":115,"stem":116,"icon":117},"Client IPs","/actix-web/client-ips","5.actix-web/2.client-ips","i-lucide-network",{"title":119,"path":120,"stem":121,"icon":44},"Keys and custom extractors","/actix-web/keys","5.actix-web/3.keys",{"title":123,"path":124,"stem":125,"icon":126},"Limits","/actix-web/limits","5.actix-web/4.limits","i-lucide-gauge",{"title":128,"path":129,"stem":130,"icon":26},"Backends","/actix-web/backends","5.actix-web/5.backends",{"title":132,"path":133,"stem":134,"icon":135},"Responses","/actix-web/responses","5.actix-web/6.responses","i-lucide-reply",{"title":137,"path":138,"stem":139,"icon":81},"Observability","/actix-web/observability","5.actix-web/7.observability",{"title":141,"path":142,"stem":143,"icon":144},"Performance","/actix-web/performance","5.actix-web/8.performance","i-lucide-timer",{"title":146,"icon":147,"defaultOpen":65,"path":148,"stem":149,"children":150,"page":65},"Guides","i-lucide-map","/guides","5.guides",[151,156,161],{"title":152,"path":153,"stem":154,"icon":155},"Configuration","/guides/configuration","5.guides/1.configuration","i-lucide-sliders-horizontal",{"title":157,"path":158,"stem":159,"icon":160},"Cleanup","/guides/cleanup","5.guides/2.cleanup","i-lucide-trash-2",{"title":162,"path":163,"stem":164,"icon":165},"Troubleshooting","/guides/troubleshooting","5.guides/4.troubleshooting","i-lucide-wrench",{"title":167,"icon":168,"defaultOpen":65,"path":169,"stem":170,"children":171,"page":65},"Reference","i-lucide-file-text","/reference","6.reference",[172],{"title":173,"path":174,"stem":175,"icon":168},"API Reference Guide","/reference/api","6.reference/1.api",{"title":177,"icon":126,"defaultOpen":65,"path":178,"stem":179,"children":180,"page":65},"Benchmarks","/benchmarks","7.benchmarks",[181,186,190],{"title":182,"path":183,"stem":184,"icon":185},"Benchmark Concepts","/benchmarks/benchmark-concepts","7.benchmarks/0.benchmark-concepts","i-lucide-book-open",{"title":187,"path":188,"stem":189,"icon":126},"Benchmarking & Load Testing","/benchmarks/benchmarking-load-testing","7.benchmarks/1.benchmarking-load-testing",{"title":191,"path":192,"stem":193,"children":194,"icon":203},"Benchmark Results","/benchmarks/benchmark-results","7.benchmarks/2.benchmark-results",[195,199],{"title":196,"path":197,"stem":198,"icon":97},"Local Benchmark Comparison","/benchmarks/benchmark-results/local-benchmark-comparison","7.benchmarks/2.benchmark-results/1.local-benchmark-comparison",{"title":200,"path":201,"stem":202,"icon":26},"Redis + Hybrid Benchmark Comparison","/benchmarks/benchmark-results/redis-benchmark-comparison","7.benchmarks/2.benchmark-results/2.redis-benchmark-comparison","i-lucide-chart-no-axes-combined",{"title":205,"path":206,"stem":207,"children":208,"icon":210,"defaultOpen":65},"Changelog","/changelog","8.changelog/0.index",[209,211,216,220,224,228,232,236],{"title":205,"path":206,"stem":207,"icon":210},"i-lucide-scroll",{"title":212,"path":213,"stem":214,"icon":215},"v2.2.1","/changelog/v2-2-1","8.changelog/1.v2-2-1","i-lucide-tag",{"title":217,"path":218,"stem":219,"icon":215},"v2.2.0","/changelog/v2-2-0","8.changelog/2.v2-2-0",{"title":221,"path":222,"stem":223,"icon":215},"v2.1.0","/changelog/v2-1-0","8.changelog/3.v2-1-0",{"title":225,"path":226,"stem":227,"icon":215},"v2.0.0","/changelog/v2-0-0","8.changelog/4.v2-0-0",{"title":229,"path":230,"stem":231,"icon":215},"v1.1.0","/changelog/v1-1-0","8.changelog/5.v1-1-0",{"title":233,"path":234,"stem":235,"icon":215},"v1.0.1","/changelog/v1-0-1","8.changelog/6.v1-0-1",{"title":237,"path":238,"stem":239,"icon":215},"v1.0.0","/changelog/v1-0-0","8.changelog/7.v1-0-0",{"id":241,"title":132,"authors":242,"badge":242,"body":243,"date":242,"description":1971,"extension":1972,"links":242,"meta":1973,"navigation":1974,"path":133,"seo":1975,"stem":134,"__hash__":1976},"docs/5.actix-web/6.responses.md",null,{"type":244,"value":245,"toc":1960},"minimark",[246,251,255,283,287,293,369,375,378,629,634,664,869,883,887,893,897,911,1090,1094,1101,1650,1661,1841,1845,1850,1946,1956],[247,248,250],"h2",{"id":249},"a-rejection","A rejection",[252,253,254],"p",{},"A rejected request never reaches the handler. It gets:",[256,257,258,267,273,276],"ul",{},[259,260,261,262,266],"li",{},"status ",[263,264,265],"code",{},"429 Too Many Requests"," (a responder can change it);",[259,268,269,272],{},[263,270,271],{},"retry-after"," in whole seconds, rounded up, when a wait time is known;",[259,274,275],{},"the rate limit headers of the chosen mode;",[259,277,278,279,282],{},"a body from the responder; the default is ",[263,280,281],{},"Too many requests, retry in 17s",".",[247,284,286],{"id":285},"header-modes","Header modes",[252,288,289,292],{},[263,290,291],{},"headers(..)"," chooses which rate limit headers responses carry. Headers the handler already set\nare never overwritten, and requests that bypass the limiter carry none.",[294,295,296,312],"table",{},[297,298,299],"thead",{},[300,301,302,306,309],"tr",{},[303,304,305],"th",{},"Mode",[303,307,308],{},"Admitted response",[303,310,311],{},"Rejected response",[313,314,315,333,353],"tbody",{},[300,316,317,324,329],{},[318,319,320,323],"td",{},[263,321,322],{},"HeaderMode::Legacy"," (default)",[318,325,326],{},[263,327,328],{},"x-ratelimit-limit: 60",[318,330,331],{},[263,332,328],{},[300,334,335,340,345],{},[318,336,337],{},[263,338,339],{},"HeaderMode::Ietf",[318,341,342],{},[263,343,344],{},"ratelimit-policy: \"ip\";q=60;w=60",[318,346,347,349,350],{},[263,348,344],{}," and ",[263,351,352],{},"ratelimit: \"ip\";r=0;t=17",[300,354,355,360,363],{},[318,356,357],{},[263,358,359],{},"HeaderMode::Off",[318,361,362],{},"none",[318,364,365,366,368],{},"none (",[263,367,271],{}," is still sent)",[252,370,371,374],{},[263,372,373],{},"Ietf"," follows draft-ietf-httpapi-ratelimit-headers-09, with the namespace as the policy name. The\ndraft is still changing, so the mode is marked unstable.",[252,376,377],{},"Turn headers off on login and other abuse-prone routes, where they tell an attacker exactly how\nfast to go:",[379,380,385],"pre",{"className":381,"code":382,"language":383,"meta":384,"style":384},"language-rust shiki shiki-themes material-theme-lighter github-light github-dark monokai","use actix_trypema::{HeaderMode, Local, TrypemaLimiter, extract::PeerIp};\nuse trypema::{RateLimit, WindowSize};\n\nlet limiter = TrypemaLimiter::builder(Local::new(WindowSize::seconds_or_panic(60))?)\n    .namespace(\"login\")\n    .extractor(PeerIp::default())\n    .rate(RateLimit::per_minute_or_panic(5.0))\n    .headers(HeaderMode::Off)\n    .build()?;\n","rust","",[263,386,387,435,457,463,520,543,563,594,613],{"__ignoreMap":384},[388,389,392,396,400,404,408,411,414,417,419,422,424,427,429,432],"span",{"class":390,"line":391},"line",1,[388,393,395],{"class":394},"shWJe","use",[388,397,399],{"class":398},"sKvfc"," actix_trypema",[388,401,403],{"class":402},"sGXK2","::",[388,405,407],{"class":406},"swvn1","{",[388,409,410],{"class":398},"HeaderMode",[388,412,413],{"class":406},",",[388,415,416],{"class":398}," Local",[388,418,413],{"class":406},[388,420,421],{"class":398}," TrypemaLimiter",[388,423,413],{"class":406},[388,425,426],{"class":398}," extract",[388,428,403],{"class":402},[388,430,431],{"class":398},"PeerIp",[388,433,434],{"class":406},"};\n",[388,436,438,440,443,445,447,450,452,455],{"class":390,"line":437},2,[388,439,395],{"class":394},[388,441,442],{"class":398}," trypema",[388,444,403],{"class":402},[388,446,407],{"class":406},[388,448,449],{"class":398},"RateLimit",[388,451,413],{"class":406},[388,453,454],{"class":398}," WindowSize",[388,456,434],{"class":406},[388,458,460],{"class":390,"line":459},3,[388,461,462],{"emptyLinePlaceholder":33},"\n",[388,464,466,470,474,477,479,481,485,488,490,492,495,497,500,502,505,507,511,514,517],{"class":390,"line":465},4,[388,467,469],{"class":468},"srJo8","let",[388,471,473],{"class":472},"ss--_"," limiter ",[388,475,476],{"class":402},"=",[388,478,421],{"class":398},[388,480,403],{"class":402},[388,482,484],{"class":483},"sD0ED","builder",[388,486,487],{"class":406},"(",[388,489,94],{"class":398},[388,491,403],{"class":402},[388,493,494],{"class":483},"new",[388,496,487],{"class":406},[388,498,499],{"class":398},"WindowSize",[388,501,403],{"class":402},[388,503,504],{"class":483},"seconds_or_panic",[388,506,487],{"class":406},[388,508,510],{"class":509},"sYThS","60",[388,512,513],{"class":406},"))",[388,515,516],{"class":402},"?",[388,518,519],{"class":406},")\n",[388,521,523,526,529,531,535,539,541],{"class":390,"line":522},5,[388,524,525],{"class":402},"    .",[388,527,528],{"class":483},"namespace",[388,530,487],{"class":406},[388,532,534],{"class":533},"siCPE","\"",[388,536,538],{"class":537},"sLACW","login",[388,540,534],{"class":533},[388,542,519],{"class":406},[388,544,546,548,551,553,555,557,560],{"class":390,"line":545},6,[388,547,525],{"class":402},[388,549,550],{"class":483},"extractor",[388,552,487],{"class":406},[388,554,431],{"class":398},[388,556,403],{"class":402},[388,558,559],{"class":483},"default",[388,561,562],{"class":406},"())\n",[388,564,566,568,571,573,575,577,580,582,585,588,591],{"class":390,"line":565},7,[388,567,525],{"class":402},[388,569,570],{"class":483},"rate",[388,572,487],{"class":406},[388,574,449],{"class":398},[388,576,403],{"class":402},[388,578,579],{"class":483},"per_minute_or_panic",[388,581,487],{"class":406},[388,583,584],{"class":509},"5",[388,586,282],{"class":587},"sMTiH",[388,589,590],{"class":509},"0",[388,592,593],{"class":406},"))\n",[388,595,597,599,602,604,606,608,611],{"class":390,"line":596},8,[388,598,525],{"class":402},[388,600,601],{"class":483},"headers",[388,603,487],{"class":406},[388,605,410],{"class":398},[388,607,403],{"class":402},[388,609,610],{"class":398},"Off",[388,612,519],{"class":406},[388,614,616,618,621,624,626],{"class":390,"line":615},9,[388,617,525],{"class":402},[388,619,620],{"class":483},"build",[388,622,623],{"class":406},"()",[388,625,516],{"class":402},[388,627,628],{"class":406},";\n",[630,631,633],"h3",{"id":632},"remaining-quota","Remaining quota",[252,635,636,639,640,643,644,647,648,651,652,654,655,657,658,660,661,663],{},[263,637,638],{},"remaining_header(true)"," adds the remaining count to admitted responses: ",[263,641,642],{},"x-ratelimit-remaining","\nin ",[263,645,646],{},"Legacy"," mode, and the ",[263,649,650],{},"ratelimit"," field in ",[263,653,373],{}," mode. It costs one extra read per\nrequest: in memory for ",[263,656,94],{},", a Redis round trip for ",[263,659,99],{},", and a local estimate for\n",[263,662,103],{}," (which then skips its synchronous fast path).",[379,665,667],{"className":381,"code":666,"language":383,"meta":384,"style":384},"use actix_trypema::{HeaderMode, Local, TrypemaLimiter, extract::PeerIp};\nuse trypema::{RateLimit, WindowSize};\n\n// Admitted: ratelimit-policy: \"api\";q=100;w=60 and ratelimit: \"api\";r=42;t=60\nlet limiter = TrypemaLimiter::builder(Local::new(WindowSize::seconds_or_panic(60))?)\n    .namespace(\"api\")\n    .extractor(PeerIp::default())\n    .rate(RateLimit::per_minute_or_panic(100.0))\n    .headers(HeaderMode::Ietf)\n    .remaining_header(true)\n    .build()?;\n",[263,668,669,699,717,721,727,767,784,800,825,841,856],{"__ignoreMap":384},[388,670,671,673,675,677,679,681,683,685,687,689,691,693,695,697],{"class":390,"line":391},[388,672,395],{"class":394},[388,674,399],{"class":398},[388,676,403],{"class":402},[388,678,407],{"class":406},[388,680,410],{"class":398},[388,682,413],{"class":406},[388,684,416],{"class":398},[388,686,413],{"class":406},[388,688,421],{"class":398},[388,690,413],{"class":406},[388,692,426],{"class":398},[388,694,403],{"class":402},[388,696,431],{"class":398},[388,698,434],{"class":406},[388,700,701,703,705,707,709,711,713,715],{"class":390,"line":437},[388,702,395],{"class":394},[388,704,442],{"class":398},[388,706,403],{"class":402},[388,708,407],{"class":406},[388,710,449],{"class":398},[388,712,413],{"class":406},[388,714,454],{"class":398},[388,716,434],{"class":406},[388,718,719],{"class":390,"line":459},[388,720,462],{"emptyLinePlaceholder":33},[388,722,723],{"class":390,"line":465},[388,724,726],{"class":725},"ss7Ak","// Admitted: ratelimit-policy: \"api\";q=100;w=60 and ratelimit: \"api\";r=42;t=60\n",[388,728,729,731,733,735,737,739,741,743,745,747,749,751,753,755,757,759,761,763,765],{"class":390,"line":522},[388,730,469],{"class":468},[388,732,473],{"class":472},[388,734,476],{"class":402},[388,736,421],{"class":398},[388,738,403],{"class":402},[388,740,484],{"class":483},[388,742,487],{"class":406},[388,744,94],{"class":398},[388,746,403],{"class":402},[388,748,494],{"class":483},[388,750,487],{"class":406},[388,752,499],{"class":398},[388,754,403],{"class":402},[388,756,504],{"class":483},[388,758,487],{"class":406},[388,760,510],{"class":509},[388,762,513],{"class":406},[388,764,516],{"class":402},[388,766,519],{"class":406},[388,768,769,771,773,775,777,780,782],{"class":390,"line":545},[388,770,525],{"class":402},[388,772,528],{"class":483},[388,774,487],{"class":406},[388,776,534],{"class":533},[388,778,779],{"class":537},"api",[388,781,534],{"class":533},[388,783,519],{"class":406},[388,785,786,788,790,792,794,796,798],{"class":390,"line":565},[388,787,525],{"class":402},[388,789,550],{"class":483},[388,791,487],{"class":406},[388,793,431],{"class":398},[388,795,403],{"class":402},[388,797,559],{"class":483},[388,799,562],{"class":406},[388,801,802,804,806,808,810,812,814,816,819,821,823],{"class":390,"line":596},[388,803,525],{"class":402},[388,805,570],{"class":483},[388,807,487],{"class":406},[388,809,449],{"class":398},[388,811,403],{"class":402},[388,813,579],{"class":483},[388,815,487],{"class":406},[388,817,818],{"class":509},"100",[388,820,282],{"class":587},[388,822,590],{"class":509},[388,824,593],{"class":406},[388,826,827,829,831,833,835,837,839],{"class":390,"line":615},[388,828,525],{"class":402},[388,830,601],{"class":483},[388,832,487],{"class":406},[388,834,410],{"class":398},[388,836,403],{"class":402},[388,838,373],{"class":398},[388,840,519],{"class":406},[388,842,844,846,849,851,854],{"class":390,"line":843},10,[388,845,525],{"class":402},[388,847,848],{"class":483},"remaining_header",[388,850,487],{"class":406},[388,852,853],{"class":587},"true",[388,855,519],{"class":406},[388,857,859,861,863,865,867],{"class":390,"line":858},11,[388,860,525],{"class":402},[388,862,620],{"class":483},[388,864,623],{"class":406},[388,866,516],{"class":402},[388,868,628],{"class":406},[252,870,871,872,875,876,878,879,882],{},"With ",[263,873,874],{},"Strategy::Suppressed",", ",[263,877,646],{}," mode also sends ",[263,880,881],{},"x-ratelimit-suppression: 0.250",", the\ncurrent suppression factor.",[247,884,886],{"id":885},"responders","Responders",[252,888,889,890,892],{},"The responder builds the rejection body. It receives the response builder with the status,\n",[263,891,271],{}," and rate limit headers already set.",[630,894,896],{"id":895},"json","JSON",[252,898,899,900,902,903,906,907,910],{},"With the ",[263,901,895],{}," feature, ",[263,904,905],{},"JsonResponder"," sends\n",[263,908,909],{},"{\"error\":\"rate_limited\",\"namespace\":\"ip\",\"retry_after_seconds\":17}",":",[379,912,914],{"className":381,"code":913,"language":383,"meta":384,"style":384},"use actix_trypema::{JsonResponder, Local, TrypemaLimiter, extract::PeerIp};\nuse trypema::{RateLimit, WindowSize};\n\nlet limiter = TrypemaLimiter::builder(Local::new(WindowSize::seconds_or_panic(60))?)\n    .namespace(\"ip\")\n    .extractor(PeerIp::default())\n    .rate(RateLimit::per_minute_or_panic(60.0))\n    .responder(JsonResponder)\n    .build()?;\n",[263,915,916,946,964,968,1008,1025,1041,1065,1078],{"__ignoreMap":384},[388,917,918,920,922,924,926,928,930,932,934,936,938,940,942,944],{"class":390,"line":391},[388,919,395],{"class":394},[388,921,399],{"class":398},[388,923,403],{"class":402},[388,925,407],{"class":406},[388,927,905],{"class":398},[388,929,413],{"class":406},[388,931,416],{"class":398},[388,933,413],{"class":406},[388,935,421],{"class":398},[388,937,413],{"class":406},[388,939,426],{"class":398},[388,941,403],{"class":402},[388,943,431],{"class":398},[388,945,434],{"class":406},[388,947,948,950,952,954,956,958,960,962],{"class":390,"line":437},[388,949,395],{"class":394},[388,951,442],{"class":398},[388,953,403],{"class":402},[388,955,407],{"class":406},[388,957,449],{"class":398},[388,959,413],{"class":406},[388,961,454],{"class":398},[388,963,434],{"class":406},[388,965,966],{"class":390,"line":459},[388,967,462],{"emptyLinePlaceholder":33},[388,969,970,972,974,976,978,980,982,984,986,988,990,992,994,996,998,1000,1002,1004,1006],{"class":390,"line":465},[388,971,469],{"class":468},[388,973,473],{"class":472},[388,975,476],{"class":402},[388,977,421],{"class":398},[388,979,403],{"class":402},[388,981,484],{"class":483},[388,983,487],{"class":406},[388,985,94],{"class":398},[388,987,403],{"class":402},[388,989,494],{"class":483},[388,991,487],{"class":406},[388,993,499],{"class":398},[388,995,403],{"class":402},[388,997,504],{"class":483},[388,999,487],{"class":406},[388,1001,510],{"class":509},[388,1003,513],{"class":406},[388,1005,516],{"class":402},[388,1007,519],{"class":406},[388,1009,1010,1012,1014,1016,1018,1021,1023],{"class":390,"line":522},[388,1011,525],{"class":402},[388,1013,528],{"class":483},[388,1015,487],{"class":406},[388,1017,534],{"class":533},[388,1019,1020],{"class":537},"ip",[388,1022,534],{"class":533},[388,1024,519],{"class":406},[388,1026,1027,1029,1031,1033,1035,1037,1039],{"class":390,"line":545},[388,1028,525],{"class":402},[388,1030,550],{"class":483},[388,1032,487],{"class":406},[388,1034,431],{"class":398},[388,1036,403],{"class":402},[388,1038,559],{"class":483},[388,1040,562],{"class":406},[388,1042,1043,1045,1047,1049,1051,1053,1055,1057,1059,1061,1063],{"class":390,"line":565},[388,1044,525],{"class":402},[388,1046,570],{"class":483},[388,1048,487],{"class":406},[388,1050,449],{"class":398},[388,1052,403],{"class":402},[388,1054,579],{"class":483},[388,1056,487],{"class":406},[388,1058,510],{"class":509},[388,1060,282],{"class":587},[388,1062,590],{"class":509},[388,1064,593],{"class":406},[388,1066,1067,1069,1072,1074,1076],{"class":390,"line":596},[388,1068,525],{"class":402},[388,1070,1071],{"class":483},"responder",[388,1073,487],{"class":406},[388,1075,905],{"class":398},[388,1077,519],{"class":406},[388,1079,1080,1082,1084,1086,1088],{"class":390,"line":615},[388,1081,525],{"class":402},[388,1083,620],{"class":483},[388,1085,623],{"class":406},[388,1087,516],{"class":402},[388,1089,628],{"class":406},[630,1091,1093],{"id":1092},"your-own","Your own",[252,1095,1096,1097,1100],{},"Implement ",[263,1098,1099],{},"RejectionResponder"," for full control, including the status:",[379,1102,1104],{"className":381,"code":1103,"language":383,"meta":384,"style":384},"use actix_trypema::{Local, RejectionInfo, RejectionResponder, TrypemaLimiter, extract::PeerIp};\nuse actix_web::{HttpResponse, HttpResponseBuilder};\nuse trypema::{RateLimit, WindowSize};\n\n/// RFC 9457 problem details.\nstruct ProblemResponder;\n\nimpl RejectionResponder for ProblemResponder {\n    fn respond(&self, info: &RejectionInfo, mut builder: HttpResponseBuilder) -> HttpResponse {\n        let retry = info\n            .retry_after\n            .map(|wait| format!(\", \\\"retry_after\\\": {}\", wait.as_secs_f64().ceil()))\n            .unwrap_or_default();\n\n        builder.content_type(\"application/problem+json\").body(format!(\n            \"{{\\\"type\\\": \\\"about:blank\\\", \\\"title\\\": \\\"Too Many Requests\\\", \\\"status\\\": 429, \\\"limit\\\": {}{retry}}}\",\n            info.limit\n        ))\n    }\n}\n\nlet limiter = TrypemaLimiter::builder(Local::new(WindowSize::seconds_or_panic(60))?)\n    .namespace(\"ip\")\n    .extractor(PeerIp::default())\n    .rate(RateLimit::per_minute_or_panic(60.0))\n    .responder(ProblemResponder)\n    .build()?;\n",[263,1105,1106,1142,1163,1181,1185,1190,1200,1204,1220,1274,1287,1295,1357,1368,1373,1408,1489,1500,1506,1512,1518,1523,1564,1581,1598,1623,1637],{"__ignoreMap":384},[388,1107,1108,1110,1112,1114,1116,1118,1120,1123,1125,1128,1130,1132,1134,1136,1138,1140],{"class":390,"line":391},[388,1109,395],{"class":394},[388,1111,399],{"class":398},[388,1113,403],{"class":402},[388,1115,407],{"class":406},[388,1117,94],{"class":398},[388,1119,413],{"class":406},[388,1121,1122],{"class":398}," RejectionInfo",[388,1124,413],{"class":406},[388,1126,1127],{"class":398}," RejectionResponder",[388,1129,413],{"class":406},[388,1131,421],{"class":398},[388,1133,413],{"class":406},[388,1135,426],{"class":398},[388,1137,403],{"class":402},[388,1139,431],{"class":398},[388,1141,434],{"class":406},[388,1143,1144,1146,1149,1151,1153,1156,1158,1161],{"class":390,"line":437},[388,1145,395],{"class":394},[388,1147,1148],{"class":398}," actix_web",[388,1150,403],{"class":402},[388,1152,407],{"class":406},[388,1154,1155],{"class":398},"HttpResponse",[388,1157,413],{"class":406},[388,1159,1160],{"class":398}," HttpResponseBuilder",[388,1162,434],{"class":406},[388,1164,1165,1167,1169,1171,1173,1175,1177,1179],{"class":390,"line":459},[388,1166,395],{"class":394},[388,1168,442],{"class":398},[388,1170,403],{"class":402},[388,1172,407],{"class":406},[388,1174,449],{"class":398},[388,1176,413],{"class":406},[388,1178,454],{"class":398},[388,1180,434],{"class":406},[388,1182,1183],{"class":390,"line":465},[388,1184,462],{"emptyLinePlaceholder":33},[388,1186,1187],{"class":390,"line":522},[388,1188,1189],{"class":725},"/// RFC 9457 problem details.\n",[388,1191,1192,1195,1198],{"class":390,"line":545},[388,1193,1194],{"class":468},"struct",[388,1196,1197],{"class":398}," ProblemResponder",[388,1199,628],{"class":406},[388,1201,1202],{"class":390,"line":565},[388,1203,462],{"emptyLinePlaceholder":33},[388,1205,1206,1209,1211,1215,1217],{"class":390,"line":596},[388,1207,1208],{"class":394},"impl",[388,1210,1127],{"class":398},[388,1212,1214],{"class":1213},"sRxSC"," for",[388,1216,1197],{"class":398},[388,1218,1219],{"class":406}," {\n",[388,1221,1222,1225,1228,1230,1233,1237,1239,1242,1244,1247,1250,1252,1256,1259,1261,1263,1266,1269,1272],{"class":390,"line":615},[388,1223,1224],{"class":394},"    fn",[388,1226,1227],{"class":483}," respond",[388,1229,487],{"class":406},[388,1231,1232],{"class":402},"&",[388,1234,1236],{"class":1235},"sSsL9","self",[388,1238,413],{"class":406},[388,1240,1241],{"class":472}," info",[388,1243,910],{"class":402},[388,1245,1246],{"class":402}," &",[388,1248,1249],{"class":398},"RejectionInfo",[388,1251,413],{"class":406},[388,1253,1255],{"class":1254},"sTNss"," mut",[388,1257,1258],{"class":472}," builder",[388,1260,910],{"class":402},[388,1262,1160],{"class":398},[388,1264,1265],{"class":406},")",[388,1267,1268],{"class":402}," ->",[388,1270,1271],{"class":398}," HttpResponse",[388,1273,1219],{"class":406},[388,1275,1276,1279,1282,1284],{"class":390,"line":843},[388,1277,1278],{"class":468},"        let",[388,1280,1281],{"class":472}," retry ",[388,1283,476],{"class":402},[388,1285,1286],{"class":472}," info\n",[388,1288,1289,1292],{"class":390,"line":858},[388,1290,1291],{"class":402},"            .",[388,1293,1294],{"class":472},"retry_after\n",[388,1296,1298,1300,1303,1305,1308,1311,1313,1316,1318,1320,1322,1326,1329,1331,1334,1337,1339,1342,1344,1347,1349,1351,1354],{"class":390,"line":1297},12,[388,1299,1291],{"class":402},[388,1301,1302],{"class":483},"map",[388,1304,487],{"class":406},[388,1306,1307],{"class":402},"|",[388,1309,1310],{"class":472},"wait",[388,1312,1307],{"class":402},[388,1314,1315],{"class":483}," format!",[388,1317,487],{"class":406},[388,1319,534],{"class":533},[388,1321,875],{"class":537},[388,1323,1325],{"class":1324},"sQeA1","\\\"",[388,1327,1328],{"class":537},"retry_after",[388,1330,1325],{"class":1324},[388,1332,1333],{"class":537},": ",[388,1335,1336],{"class":533},"{}\"",[388,1338,413],{"class":406},[388,1340,1341],{"class":472}," wait",[388,1343,282],{"class":402},[388,1345,1346],{"class":483},"as_secs_f64",[388,1348,623],{"class":406},[388,1350,282],{"class":402},[388,1352,1353],{"class":483},"ceil",[388,1355,1356],{"class":406},"()))\n",[388,1358,1360,1362,1365],{"class":390,"line":1359},13,[388,1361,1291],{"class":402},[388,1363,1364],{"class":483},"unwrap_or_default",[388,1366,1367],{"class":406},"();\n",[388,1369,1371],{"class":390,"line":1370},14,[388,1372,462],{"emptyLinePlaceholder":33},[388,1374,1376,1379,1381,1384,1386,1388,1391,1393,1395,1397,1400,1402,1405],{"class":390,"line":1375},15,[388,1377,1378],{"class":472},"        builder",[388,1380,282],{"class":402},[388,1382,1383],{"class":483},"content_type",[388,1385,487],{"class":406},[388,1387,534],{"class":533},[388,1389,1390],{"class":537},"application/problem+json",[388,1392,534],{"class":533},[388,1394,1265],{"class":406},[388,1396,282],{"class":402},[388,1398,1399],{"class":483},"body",[388,1401,487],{"class":406},[388,1403,1404],{"class":483},"format!",[388,1406,1407],{"class":406},"(\n",[388,1409,1411,1414,1417,1419,1422,1424,1426,1428,1431,1433,1435,1437,1440,1442,1444,1446,1449,1451,1453,1455,1458,1460,1463,1465,1468,1470,1472,1475,1478,1481,1484,1486],{"class":390,"line":1410},16,[388,1412,1413],{"class":533},"            \"",[388,1415,1416],{"class":537},"{{",[388,1418,1325],{"class":1324},[388,1420,1421],{"class":537},"type",[388,1423,1325],{"class":1324},[388,1425,1333],{"class":537},[388,1427,1325],{"class":1324},[388,1429,1430],{"class":537},"about:blank",[388,1432,1325],{"class":1324},[388,1434,875],{"class":537},[388,1436,1325],{"class":1324},[388,1438,1439],{"class":537},"title",[388,1441,1325],{"class":1324},[388,1443,1333],{"class":537},[388,1445,1325],{"class":1324},[388,1447,1448],{"class":537},"Too Many Requests",[388,1450,1325],{"class":1324},[388,1452,875],{"class":537},[388,1454,1325],{"class":1324},[388,1456,1457],{"class":537},"status",[388,1459,1325],{"class":1324},[388,1461,1462],{"class":537},": 429, ",[388,1464,1325],{"class":1324},[388,1466,1467],{"class":537},"limit",[388,1469,1325],{"class":1324},[388,1471,1333],{"class":537},[388,1473,1474],{"class":533},"{}{",[388,1476,1477],{"class":537},"retry",[388,1479,1480],{"class":533},"}",[388,1482,1483],{"class":537},"}}",[388,1485,534],{"class":533},[388,1487,1488],{"class":406},",\n",[388,1490,1492,1495,1497],{"class":390,"line":1491},17,[388,1493,1494],{"class":472},"            info",[388,1496,282],{"class":402},[388,1498,1499],{"class":472},"limit\n",[388,1501,1503],{"class":390,"line":1502},18,[388,1504,1505],{"class":406},"        ))\n",[388,1507,1509],{"class":390,"line":1508},19,[388,1510,1511],{"class":406},"    }\n",[388,1513,1515],{"class":390,"line":1514},20,[388,1516,1517],{"class":406},"}\n",[388,1519,1521],{"class":390,"line":1520},21,[388,1522,462],{"emptyLinePlaceholder":33},[388,1524,1526,1528,1530,1532,1534,1536,1538,1540,1542,1544,1546,1548,1550,1552,1554,1556,1558,1560,1562],{"class":390,"line":1525},22,[388,1527,469],{"class":468},[388,1529,473],{"class":472},[388,1531,476],{"class":402},[388,1533,421],{"class":398},[388,1535,403],{"class":402},[388,1537,484],{"class":483},[388,1539,487],{"class":406},[388,1541,94],{"class":398},[388,1543,403],{"class":402},[388,1545,494],{"class":483},[388,1547,487],{"class":406},[388,1549,499],{"class":398},[388,1551,403],{"class":402},[388,1553,504],{"class":483},[388,1555,487],{"class":406},[388,1557,510],{"class":509},[388,1559,513],{"class":406},[388,1561,516],{"class":402},[388,1563,519],{"class":406},[388,1565,1567,1569,1571,1573,1575,1577,1579],{"class":390,"line":1566},23,[388,1568,525],{"class":402},[388,1570,528],{"class":483},[388,1572,487],{"class":406},[388,1574,534],{"class":533},[388,1576,1020],{"class":537},[388,1578,534],{"class":533},[388,1580,519],{"class":406},[388,1582,1584,1586,1588,1590,1592,1594,1596],{"class":390,"line":1583},24,[388,1585,525],{"class":402},[388,1587,550],{"class":483},[388,1589,487],{"class":406},[388,1591,431],{"class":398},[388,1593,403],{"class":402},[388,1595,559],{"class":483},[388,1597,562],{"class":406},[388,1599,1601,1603,1605,1607,1609,1611,1613,1615,1617,1619,1621],{"class":390,"line":1600},25,[388,1602,525],{"class":402},[388,1604,570],{"class":483},[388,1606,487],{"class":406},[388,1608,449],{"class":398},[388,1610,403],{"class":402},[388,1612,579],{"class":483},[388,1614,487],{"class":406},[388,1616,510],{"class":509},[388,1618,282],{"class":587},[388,1620,590],{"class":509},[388,1622,593],{"class":406},[388,1624,1626,1628,1630,1632,1635],{"class":390,"line":1625},26,[388,1627,525],{"class":402},[388,1629,1071],{"class":483},[388,1631,487],{"class":406},[388,1633,1634],{"class":398},"ProblemResponder",[388,1636,519],{"class":406},[388,1638,1640,1642,1644,1646,1648],{"class":390,"line":1639},27,[388,1641,525],{"class":402},[388,1643,620],{"class":483},[388,1645,623],{"class":406},[388,1647,516],{"class":402},[388,1649,628],{"class":406},[252,1651,1652,1653,1656,1657,1660],{},"Change the status with ",[263,1654,1655],{},"builder.status(..)",", for example to answer ",[263,1658,1659],{},"503"," while shedding load:",[379,1662,1664],{"className":381,"code":1663,"language":383,"meta":384,"style":384},"use actix_trypema::{RejectionInfo, RejectionResponder};\nuse actix_web::{HttpResponse, HttpResponseBuilder, http::StatusCode};\n\nstruct ShedResponder;\n\nimpl RejectionResponder for ShedResponder {\n    fn respond(&self, info: &RejectionInfo, mut builder: HttpResponseBuilder) -> HttpResponse {\n        builder\n            .status(StatusCode::SERVICE_UNAVAILABLE)\n            .body(format!(\"{} is busy, try again shortly\", info.namespace))\n    }\n}\n",[263,1665,1666,1684,1712,1716,1725,1729,1741,1781,1786,1803,1833,1837],{"__ignoreMap":384},[388,1667,1668,1670,1672,1674,1676,1678,1680,1682],{"class":390,"line":391},[388,1669,395],{"class":394},[388,1671,399],{"class":398},[388,1673,403],{"class":402},[388,1675,407],{"class":406},[388,1677,1249],{"class":398},[388,1679,413],{"class":406},[388,1681,1127],{"class":398},[388,1683,434],{"class":406},[388,1685,1686,1688,1690,1692,1694,1696,1698,1700,1702,1705,1707,1710],{"class":390,"line":437},[388,1687,395],{"class":394},[388,1689,1148],{"class":398},[388,1691,403],{"class":402},[388,1693,407],{"class":406},[388,1695,1155],{"class":398},[388,1697,413],{"class":406},[388,1699,1160],{"class":398},[388,1701,413],{"class":406},[388,1703,1704],{"class":398}," http",[388,1706,403],{"class":402},[388,1708,1709],{"class":398},"StatusCode",[388,1711,434],{"class":406},[388,1713,1714],{"class":390,"line":459},[388,1715,462],{"emptyLinePlaceholder":33},[388,1717,1718,1720,1723],{"class":390,"line":465},[388,1719,1194],{"class":468},[388,1721,1722],{"class":398}," ShedResponder",[388,1724,628],{"class":406},[388,1726,1727],{"class":390,"line":522},[388,1728,462],{"emptyLinePlaceholder":33},[388,1730,1731,1733,1735,1737,1739],{"class":390,"line":545},[388,1732,1208],{"class":394},[388,1734,1127],{"class":398},[388,1736,1214],{"class":1213},[388,1738,1722],{"class":398},[388,1740,1219],{"class":406},[388,1742,1743,1745,1747,1749,1751,1753,1755,1757,1759,1761,1763,1765,1767,1769,1771,1773,1775,1777,1779],{"class":390,"line":565},[388,1744,1224],{"class":394},[388,1746,1227],{"class":483},[388,1748,487],{"class":406},[388,1750,1232],{"class":402},[388,1752,1236],{"class":1235},[388,1754,413],{"class":406},[388,1756,1241],{"class":472},[388,1758,910],{"class":402},[388,1760,1246],{"class":402},[388,1762,1249],{"class":398},[388,1764,413],{"class":406},[388,1766,1255],{"class":1254},[388,1768,1258],{"class":472},[388,1770,910],{"class":402},[388,1772,1160],{"class":398},[388,1774,1265],{"class":406},[388,1776,1268],{"class":402},[388,1778,1271],{"class":398},[388,1780,1219],{"class":406},[388,1782,1783],{"class":390,"line":596},[388,1784,1785],{"class":472},"        builder\n",[388,1787,1788,1790,1792,1794,1796,1798,1801],{"class":390,"line":615},[388,1789,1291],{"class":402},[388,1791,1457],{"class":483},[388,1793,487],{"class":406},[388,1795,1709],{"class":398},[388,1797,403],{"class":402},[388,1799,1800],{"class":1324},"SERVICE_UNAVAILABLE",[388,1802,519],{"class":406},[388,1804,1805,1807,1809,1811,1813,1815,1818,1821,1823,1825,1827,1829,1831],{"class":390,"line":843},[388,1806,1291],{"class":402},[388,1808,1399],{"class":483},[388,1810,487],{"class":406},[388,1812,1404],{"class":483},[388,1814,487],{"class":406},[388,1816,1817],{"class":533},"\"{}",[388,1819,1820],{"class":537}," is busy, try again shortly",[388,1822,534],{"class":533},[388,1824,413],{"class":406},[388,1826,1241],{"class":472},[388,1828,282],{"class":402},[388,1830,528],{"class":472},[388,1832,593],{"class":406},[388,1834,1835],{"class":390,"line":858},[388,1836,1511],{"class":406},[388,1838,1839],{"class":390,"line":1297},[388,1840,1517],{"class":406},[630,1842,1844],{"id":1843},"what-a-responder-can-see","What a responder can see",[252,1846,1847,1849],{},[263,1848,1249],{}," describes the rejection:",[294,1851,1852,1862],{},[297,1853,1854],{},[300,1855,1856,1859],{},[303,1857,1858],{},"Field",[303,1860,1861],{},"Meaning",[313,1863,1864,1873,1890,1904,1913,1926,1936],{},[300,1865,1866,1870],{},[318,1867,1868],{},[263,1869,528],{},[318,1871,1872],{},"The rejecting limiter.",[300,1874,1875,1880],{},[318,1876,1877],{},[263,1878,1879],{},"key",[318,1881,1882,1883,282],{},"The stored key, as from ",[1884,1885,1887],"a",{"href":1886},"/actix-web/keys#the-stored-key",[263,1888,1889],{},"derived_key",[300,1891,1892,1897],{},[318,1893,1894],{},[263,1895,1896],{},"strategy",[318,1898,1899,1901,1902,282],{},[263,1900,73],{}," or ",[263,1903,78],{},[300,1905,1906,1910],{},[318,1907,1908],{},[263,1909,1467],{},[318,1911,1912],{},"The capacity per window.",[300,1914,1915,1919],{},[318,1916,1917],{},[263,1918,1328],{},[318,1920,1921,1922,1925],{},"Best-effort wait until capacity frees up; ",[263,1923,1924],{},"None"," when unknown.",[300,1927,1928,1933],{},[318,1929,1930],{},[263,1931,1932],{},"remaining_after_waiting",[318,1934,1935],{},"Capacity freed after waiting, when known.",[300,1937,1938,1943],{},[318,1939,1940],{},[263,1941,1942],{},"suppression_factor",[318,1944,1945],{},"The factor, for suppressed rejections.",[252,1947,1948,1949,1951,1952,1955],{},"The same ",[263,1950,1249],{}," is attached to the rejection response's extensions, so outer\nmiddleware such as ",[263,1953,1954],{},"ErrorHandlers"," can read it too.",[1957,1958,1959],"style",{},"html pre.shiki code .shWJe, html code.shiki .shWJe{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sKvfc, html code.shiki .sKvfc{--shiki-light:#E2931D;--shiki-light-text-decoration:inherit;--shiki-default:#6F42C1;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .srJo8, html code.shiki .srJo8{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .ss--_, html code.shiki .ss--_{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sD0ED, html code.shiki .sD0ED{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sYThS, html code.shiki .sYThS{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sMTiH, html code.shiki .sMTiH{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .ss7Ak, html code.shiki .ss7Ak{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}html pre.shiki code .sRxSC, html code.shiki .sRxSC{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#F92672;--shiki-sepia-font-style:inherit}html pre.shiki code .sSsL9, html code.shiki .sSsL9{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#FD971F}html pre.shiki code .sTNss, html code.shiki .sTNss{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sQeA1, html code.shiki .sQeA1{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}",{"title":384,"searchDepth":391,"depth":437,"links":1961},[1962,1963,1966],{"id":249,"depth":437,"text":250},{"id":285,"depth":437,"text":286,"children":1964},[1965],{"id":632,"depth":459,"text":633},{"id":885,"depth":437,"text":886,"children":1967},[1968,1969,1970],{"id":895,"depth":459,"text":896},{"id":1092,"depth":459,"text":1093},{"id":1843,"depth":459,"text":1844},"The headers admitted and rejected responses carry, and how to customize the rejection body and status.","md",{},{"icon":135},{"title":132,"description":1971},"pwNNsMilmA1whg168OMOcNUguYyxWaJZWEWrYBZQqFM",[1978,1980],{"title":128,"path":129,"stem":130,"description":1979,"icon":26,"children":-1},"Choose where counts live (in process, in Redis, or both), tune the provider, and decide what happens when Redis fails.",{"title":137,"path":138,"stem":139,"description":1981,"icon":81,"children":-1},"Try limits in shadow mode, read each limiter's decision in handlers, export metrics, and reset or change individual keys.",1791663192490]