Skip to content

Commit 6720875

Browse files
committed
correctly parse Forwarded: proto=https
1 parent 35310e8 commit 6720875

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

src/proxies/forwarded.rs

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -170,17 +170,11 @@ impl<'a> Forwarded<'a> {
170170
input = forwarded.parse_for(input)?;
171171
}
172172

173-
loop {
174-
match input.chars().next() {
175-
Some(';') => {
176-
input = &input[1..];
177-
}
178-
None => return Ok(forwarded),
179-
_ => return Err(ParseError::new("unexpected character after forwarded-pair")),
180-
}
181-
173+
while !input.is_empty() {
182174
input = forwarded.parse_forwarded_pair(input)?;
183175
}
176+
177+
Ok(forwarded)
184178
}
185179

186180
fn parse_forwarded_pair(&mut self, input: &'a str) -> Result<&'a str, ParseError> {
@@ -218,7 +212,11 @@ impl<'a> Forwarded<'a> {
218212
_ => { /* extensions are allowed in the spec */ }
219213
}
220214

221-
Ok(rest)
215+
if rest.starts_with(';') {
216+
Ok(&rest[1..])
217+
} else {
218+
Ok(rest)
219+
}
222220
}
223221

224222
fn parse_for(&mut self, input: &'a str) -> Result<&'a str, ParseError> {
@@ -246,8 +244,13 @@ impl<'a> Forwarded<'a> {
246244
rest = rest[1..].trim_start();
247245
}
248246

247+
Some(';') => {
248+
rest = &rest[1..];
249+
break;
250+
}
251+
249252
// reached the end of the for section or the input
250-
None | Some(';') => break,
253+
None => break,
251254

252255
// bail
253256
_ => return Err(ParseError::new("unexpected character after for= section")),
@@ -537,13 +540,13 @@ mod tests {
537540
let err = Forwarded::parse("by=proxy.com;for=client;host=example.com;host").unwrap_err();
538541
assert_eq!(
539542
err.to_string(),
540-
"unable to parse forwarded header: unexpected character after forwarded-pair"
543+
"unable to parse forwarded header: parse error in forwarded-pair"
541544
);
542545

543546
let err = Forwarded::parse("by;for;host;proto").unwrap_err();
544547
assert_eq!(
545548
err.to_string(),
546-
"unable to parse forwarded header: unexpected character after forwarded-pair"
549+
"unable to parse forwarded header: parse error in forwarded-pair"
547550
);
548551

549552
let err = Forwarded::parse("for=for, key=value").unwrap_err();
@@ -571,7 +574,7 @@ mod tests {
571574
response.append_header("forwarded", "uh oh");
572575
assert_eq!(
573576
Forwarded::from_headers(&response).unwrap_err().to_string(),
574-
"unable to parse forwarded header: unexpected character after forwarded-pair"
577+
"unable to parse forwarded header: parse error in forwarded-pair"
575578
);
576579

577580
let response = Response::new(200);
@@ -609,6 +612,9 @@ mod tests {
609612
assert_eq!(forwarded.forwarded_for(), vec![";", ",", "\"", "unquoted"]);
610613
assert_eq!(forwarded.by(), Some(";proto=https"));
611614
assert!(forwarded.proto().is_none());
615+
616+
let forwarded = Forwarded::parse("proto=https").unwrap();
617+
assert_eq!(forwarded.proto(), Some("https"));
612618
}
613619

614620
#[test]

0 commit comments

Comments
 (0)