Skip to content

Commit 2069eab

Browse files
pietroalbiniTurbo87
authored andcommitted
helpers/pagination: Implement enable_pages flag
1 parent 30f236b commit 2069eab

File tree

1 file changed

+44
-24
lines changed

1 file changed

+44
-24
lines changed

src/controllers/helpers/pagination.rs

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ impl PaginationOptions {
3535
PaginationOptionsBuilder {
3636
limit_page_numbers: None,
3737
enable_seek: false,
38+
enable_pages: true,
3839
}
3940
}
4041

@@ -49,6 +50,7 @@ impl PaginationOptions {
4950

5051
pub(crate) struct PaginationOptionsBuilder {
5152
limit_page_numbers: Option<Arc<App>>,
53+
enable_pages: bool,
5254
enable_seek: bool,
5355
}
5456

@@ -58,6 +60,11 @@ impl PaginationOptionsBuilder {
5860
self
5961
}
6062

63+
pub(crate) fn enable_pages(mut self, enable: bool) -> Self {
64+
self.enable_pages = enable;
65+
self
66+
}
67+
6168
pub(crate) fn enable_seek(mut self, enable: bool) -> Self {
6269
self.enable_seek = enable;
6370
self
@@ -75,34 +82,38 @@ impl PaginationOptionsBuilder {
7582
}
7683

7784
let page = if let Some(s) = page_param {
78-
let numeric_page = s.parse().map_err(|e| bad_request(&e))?;
79-
if numeric_page < 1 {
80-
return Err(bad_request(&format_args!(
81-
"page indexing starts from 1, page {} is invalid",
82-
numeric_page,
83-
)));
84-
}
85+
if self.enable_pages {
86+
let numeric_page = s.parse().map_err(|e| bad_request(&e))?;
87+
if numeric_page < 1 {
88+
return Err(bad_request(&format_args!(
89+
"page indexing starts from 1, page {} is invalid",
90+
numeric_page,
91+
)));
92+
}
8593

86-
if numeric_page > MAX_PAGE_BEFORE_SUSPECTED_BOT {
87-
req.log_metadata("bot", "suspected");
88-
}
94+
if numeric_page > MAX_PAGE_BEFORE_SUSPECTED_BOT {
95+
req.log_metadata("bot", "suspected");
96+
}
8997

90-
// Block large offsets for known violators of the crawler policy
91-
if let Some(app) = self.limit_page_numbers {
92-
let config = &app.config;
93-
let user_agent = request_header(req, header::USER_AGENT);
94-
if numeric_page > config.max_allowed_page_offset
95-
&& config
96-
.page_offset_ua_blocklist
97-
.iter()
98-
.any(|blocked| user_agent.contains(blocked))
99-
{
100-
add_custom_metadata(req, "cause", "large page offset");
101-
return Err(bad_request("requested page offset is too large"));
98+
// Block large offsets for known violators of the crawler policy
99+
if let Some(app) = self.limit_page_numbers {
100+
let config = &app.config;
101+
let user_agent = request_header(req, header::USER_AGENT);
102+
if numeric_page > config.max_allowed_page_offset
103+
&& config
104+
.page_offset_ua_blocklist
105+
.iter()
106+
.any(|blocked| user_agent.contains(blocked))
107+
{
108+
add_custom_metadata(req, "cause", "large page offset");
109+
return Err(bad_request("requested page offset is too large"));
110+
}
102111
}
103-
}
104112

105-
Page::Numeric(numeric_page)
113+
Page::Numeric(numeric_page)
114+
} else {
115+
return Err(bad_request("?page= is not supported for this request"));
116+
}
106117
} else if let Some(s) = seek_param {
107118
if self.enable_seek {
108119
Page::Seek(RawSeekPayload(s.clone()))
@@ -348,6 +359,15 @@ mod tests {
348359
);
349360
}
350361

362+
#[test]
363+
fn disabled_pages() {
364+
assert_pagination_error(
365+
PaginationOptions::builder().enable_pages(false),
366+
"page=1",
367+
"?page= is not supported for this request",
368+
);
369+
}
370+
351371
#[test]
352372
fn test_seek_encode_and_decode() {
353373
// Encoding produces the results we expect

0 commit comments

Comments
 (0)