Skip to content

Commit

Permalink
fix: remove dependency on regex to reduce wasm size
Browse files Browse the repository at this point in the history
  • Loading branch information
przydatek committed Nov 5, 2024
1 parent 7647269 commit 74854fd
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 46 deletions.
10 changes: 8 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ bytes = "1"
base64 = "0.22"
lazy_static = "1"
rand_chacha = "0.3"
regex = "1"
serde = "1"
serde_cbor = "0.11"
sha2 = "0.10"
text_io = "0.1"
tokio = { version = "1", features = ["full"] }
hyper = { version = "1", features = ["full"] }
hyper-util = "0.1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ candid.workspace = true
http.workspace = true
ic-cdk.workspace = true
ic-cdk-macros.workspace = true
regex.workspace = true
serde.workspace = true
serde_cbor.workspace = true
sha2.workspace = true
text_io.workspace = true
lazy_static.workspace = true
base64.workspace = true
include_dir = { version = "0.7", features = ["glob"] }
Expand Down
20 changes: 11 additions & 9 deletions examples/http-gateway/canister/src/custom_assets/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use ic_http_certification::{
use rand_chacha::rand_core::{RngCore, SeedableRng};
use rand_chacha::ChaCha20Rng;
use std::cell::RefCell;
use text_io::try_scan;

#[init]
fn init() {
Expand Down Expand Up @@ -162,15 +163,16 @@ fn get_header_value(headers: &[HeaderField], header_name: &str) -> Option<String

fn get_content_range_begin(content_range_header_value: &str) -> usize {
// expected format: `bytes 21010-47021/47022`
let re = regex::Regex::new(r"bytes\s+(\d+)-(\d+)/(\d+)").expect("invalid RE");
let caps = re
.captures(content_range_header_value)
.expect("malformed Content-Range header");
caps.get(1)
.expect("missing range-begin")
.as_str()
.parse()
.expect("malformed range-begin")
fn parse(value: &str) -> Result<(usize, usize, usize), Box<dyn std::error::Error>> {
let (range_begin, range_end, total_length);
try_scan!(value.bytes() => "bytes {}-{}/{}", range_begin, range_end, total_length);
Ok((range_begin, range_end, total_length))
}
let parsed = parse(content_range_header_value).expect(&format!(
"invalid Content-Range header: {}",
content_range_header_value
));
parsed.0
}

thread_local! {
Expand Down
2 changes: 1 addition & 1 deletion packages/ic-http-gateway/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ http.workspace = true
http-body.workspace = true
http-body-util.workspace = true
bytes.workspace = true
regex.workspace = true
text_io.workspace = true

ic-agent.workspace = true
ic-utils.workspace = true
Expand Down
51 changes: 19 additions & 32 deletions packages/ic-http-gateway/src/response/response_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use ic_utils::{
StreamingCallbackHttpResponse, StreamingStrategy, Token,
},
};
use regex::Regex;
use text_io::try_scan;

// Limit the total number of calls to an HTTP Request loop to 1000 for now.
static MAX_HTTP_REQUEST_STREAM_CALLBACK_CALL_COUNT: usize = 1000;
Expand Down Expand Up @@ -177,42 +177,29 @@ struct ContentRangeValues {

fn parse_content_range_header_str(str_value: &str) -> Result<ContentRangeValues, AgentError> {
// expected format: `bytes 21010-47021/47022`
let re = Regex::new(r"bytes\s+(\d+)-(\d+)/(\d+)").unwrap();
let Some(caps) = re.captures(str_value) else {
return Err(AgentError::InvalidHttpResponse(
"malformed Content-Range header".to_string(),
));
};
let range_begin: usize = caps
.get(1)
.ok_or_else(|| AgentError::InvalidHttpResponse("missing range-begin".to_string()))?
.as_str()
.parse()
.map_err(|_| AgentError::InvalidHttpResponse("malformed range-begin".to_string()))?;
let range_end: usize = caps
.get(2)
.ok_or_else(|| AgentError::InvalidHttpResponse("missing range-end".to_string()))?
.as_str()
.parse()
.map_err(|_| AgentError::InvalidHttpResponse("malformed range-end".to_string()))?;
let total_length: usize = caps
.get(3)
.ok_or_else(|| AgentError::InvalidHttpResponse("missing size".to_string()))?
.as_str()
.parse()
.map_err(|_| AgentError::InvalidHttpResponse("malformed size".to_string()))?;
let range_values = ContentRangeValues {
range_begin,
range_end,
total_length,
fn parse(value: &str) -> Result<(usize, usize, usize), Box<dyn std::error::Error>> {
let (range_begin, range_end, total_length);
try_scan!(value.bytes() => "bytes {}-{}/{}", range_begin, range_end, total_length);
Ok((range_begin, range_end, total_length))
}
let parsed = parse(str_value).map_err(|e| {
AgentError::InvalidHttpResponse(format!("malformed Content-Range header: {:?}", e))
})?;
let rv = ContentRangeValues {
range_begin: parsed.0,
range_end: parsed.1,
total_length: parsed.2,
};
if range_begin > range_end || range_begin >= total_length || range_end >= total_length {
if rv.range_begin > rv.range_end
|| rv.range_begin >= rv.total_length
|| rv.range_end >= rv.total_length
{
Err(AgentError::InvalidHttpResponse(format!(
"inconsistent Content-Range header {:?}",
range_values
rv
)))
} else {
Ok(range_values)
Ok(rv)
}
}

Expand Down

0 comments on commit 74854fd

Please sign in to comment.