Skip to content

Commit

Permalink
Make a HeadersRateLimitFilter
Browse files Browse the repository at this point in the history
Summary: I'm making separate RateLimitFilters for each of the events (control messages, headers, direct error handling, etc) that we rate limit. This is one step of that process.

Reviewed By: afrind

Differential Revision: D50698700

fbshipit-source-id: c6dedc97acb090b2aecb19b1680fe65beb72add7
  • Loading branch information
Aman Sharma authored and facebook-github-bot committed Nov 4, 2023
1 parent d11d74f commit 8ce3f02
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 4 deletions.
55 changes: 55 additions & 0 deletions proxygen/lib/http/codec/HeadersRateLimitFilter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/

#pragma once

#include <proxygen/lib/http/codec/HTTP2Constants.h>
#include <proxygen/lib/http/codec/RateLimitFilter.h>

namespace proxygen {

class HeadersRateLimitFilter : public RateLimitFilter {
public:
static const uint32_t kDefaultMaxEventsPerInterval = 50000;
static const uint32_t kMaxEventsPerIntervalLowerBound = 100;
static constexpr std::chrono::milliseconds kDefaultTimeoutDuration{100};

explicit HeadersRateLimitFilter(folly::HHWheelTimer* timer,
HTTPSessionStats* httpSessionStats)
: RateLimitFilter(timer, httpSessionStats) {
maxEventsInInterval_ = kDefaultMaxEventsPerInterval;
timeoutDuration_ = kDefaultTimeoutDuration;
}

void onHeadersComplete(StreamID stream,
std::unique_ptr<HTTPMessage> msg) override {
if (!incrementNumEventsInCurrentInterval()) {
callback_->onHeadersComplete(stream, std::move(msg));
} else {
callback_->onGoaway(http2::kMaxStreamID, ErrorCode::NO_ERROR);
}
}

void recordNumEventsInCurrentInterval(uint32_t numEvents) override {
if (httpSessionStats_) {
httpSessionStats_->recordHeadersInInterval(numEvents);
}
}

void recordRateLimitBreached() override {
if (httpSessionStats_) {
httpSessionStats_->recordHeadersRateLimited();
}
}

uint32_t getMaxEventsPerInvervalLowerBound() const override {
return kMaxEventsPerIntervalLowerBound;
}
};

} // namespace proxygen
7 changes: 3 additions & 4 deletions proxygen/lib/http/codec/RateLimitFilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
* LICENSE file in the root directory of this source tree.
*/

#include <proxygen/lib/http/codec/HeadersRateLimitFilter.h>
#include <proxygen/lib/http/codec/RateLimitFilter.h>

namespace proxygen {
Expand All @@ -26,12 +27,10 @@ std::string_view RateLimitFilter::toStr(Type type) {
}

std::unique_ptr<RateLimitFilter> RateLimitFilter::createRateLimitFilter(
Type type,
folly::HHWheelTimer* /* timer */,
HTTPSessionStats* /* httpSessionStats */) {
Type type, folly::HHWheelTimer* timer, HTTPSessionStats* httpSessionStats) {
switch (type) {
case Type::HEADERS:
return nullptr;
return std::make_unique<HeadersRateLimitFilter>(timer, httpSessionStats);
case Type::MISC_CONTROL_MSGS:
return nullptr;
case Type::RSTS:
Expand Down

0 comments on commit 8ce3f02

Please sign in to comment.