Vendor things
This commit is contained in:
parent
5deceec006
commit
977e3c17e5
19434 changed files with 10682014 additions and 0 deletions
36
third-party/vendor/winnow/examples/http/bench.rs
vendored
Normal file
36
third-party/vendor/winnow/examples/http/bench.rs
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
mod parser;
|
||||
mod parser_streaming;
|
||||
|
||||
fn one_test(c: &mut criterion::Criterion) {
|
||||
let data = &b"GET / HTTP/1.1
|
||||
Host: www.reddit.com
|
||||
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
|
||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
|
||||
Accept-Language: en-us,en;q=0.5
|
||||
Accept-Encoding: gzip, deflate
|
||||
Connection: keep-alive
|
||||
|
||||
"[..];
|
||||
|
||||
let mut http_group = c.benchmark_group("http");
|
||||
http_group.throughput(criterion::Throughput::Bytes(data.len() as u64));
|
||||
http_group.bench_with_input(
|
||||
criterion::BenchmarkId::new("complete", data.len()),
|
||||
data,
|
||||
|b, data| {
|
||||
b.iter(|| parser::parse(data).unwrap());
|
||||
},
|
||||
);
|
||||
http_group.bench_with_input(
|
||||
criterion::BenchmarkId::new("streaming", data.len()),
|
||||
data,
|
||||
|b, data| {
|
||||
b.iter(|| parser_streaming::parse(data).unwrap());
|
||||
},
|
||||
);
|
||||
|
||||
http_group.finish();
|
||||
}
|
||||
|
||||
criterion::criterion_group!(http, one_test);
|
||||
criterion::criterion_main!(http);
|
||||
47
third-party/vendor/winnow/examples/http/main.rs
vendored
Normal file
47
third-party/vendor/winnow/examples/http/main.rs
vendored
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
mod parser;
|
||||
|
||||
fn main() -> Result<(), lexopt::Error> {
|
||||
let args = Args::parse()?;
|
||||
|
||||
let input = args.input.as_deref().unwrap_or(
|
||||
"GET / HTTP/1.1
|
||||
Host: www.reddit.com
|
||||
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1
|
||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
|
||||
Accept-Language: en-us,en;q=0.5
|
||||
Accept-Encoding: gzip, deflate
|
||||
Connection: keep-alive
|
||||
|
||||
",
|
||||
);
|
||||
|
||||
if let Some(result) = parser::parse(input.as_bytes()) {
|
||||
println!(" {:#?}", result);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
struct Args {
|
||||
input: Option<String>,
|
||||
}
|
||||
|
||||
impl Args {
|
||||
fn parse() -> Result<Self, lexopt::Error> {
|
||||
use lexopt::prelude::*;
|
||||
|
||||
let mut res = Args::default();
|
||||
|
||||
let mut args = lexopt::Parser::from_env();
|
||||
while let Some(arg) = args.next()? {
|
||||
match arg {
|
||||
Value(input) => {
|
||||
res.input = Some(input.string()?);
|
||||
}
|
||||
_ => return Err(arg.unexpected()),
|
||||
}
|
||||
}
|
||||
Ok(res)
|
||||
}
|
||||
}
|
||||
137
third-party/vendor/winnow/examples/http/parser.rs
vendored
Normal file
137
third-party/vendor/winnow/examples/http/parser.rs
vendored
Normal file
|
|
@ -0,0 +1,137 @@
|
|||
use winnow::combinator::seq;
|
||||
use winnow::prelude::*;
|
||||
use winnow::{ascii::line_ending, combinator::repeat, token::take_while};
|
||||
|
||||
pub type Stream<'i> = &'i [u8];
|
||||
|
||||
#[rustfmt::skip]
|
||||
#[derive(Debug)]
|
||||
#[allow(dead_code)]
|
||||
pub struct Request<'a> {
|
||||
method: &'a [u8],
|
||||
uri: &'a [u8],
|
||||
version: &'a [u8],
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
#[allow(dead_code)]
|
||||
pub struct Header<'a> {
|
||||
name: &'a [u8],
|
||||
value: Vec<&'a [u8]>,
|
||||
}
|
||||
|
||||
pub fn parse(data: &[u8]) -> Option<Vec<(Request<'_>, Vec<Header<'_>>)>> {
|
||||
let mut buf = data;
|
||||
let mut v = Vec::new();
|
||||
loop {
|
||||
match request(&mut buf) {
|
||||
Ok(r) => {
|
||||
v.push(r);
|
||||
|
||||
if buf.is_empty() {
|
||||
//println!("{}", i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
println!("error: {:?}", e);
|
||||
return None;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Some(v)
|
||||
}
|
||||
|
||||
fn request<'s>(input: &mut Stream<'s>) -> PResult<(Request<'s>, Vec<Header<'s>>)> {
|
||||
let req = request_line(input)?;
|
||||
let h = repeat(1.., message_header).parse_next(input)?;
|
||||
let _ = line_ending.parse_next(input)?;
|
||||
|
||||
Ok((req, h))
|
||||
}
|
||||
|
||||
fn request_line<'s>(input: &mut Stream<'s>) -> PResult<Request<'s>> {
|
||||
seq!( Request {
|
||||
method: take_while(1.., is_token),
|
||||
_: take_while(1.., is_space),
|
||||
uri: take_while(1.., is_not_space),
|
||||
_: take_while(1.., is_space),
|
||||
version: http_version,
|
||||
_: line_ending,
|
||||
})
|
||||
.parse_next(input)
|
||||
}
|
||||
|
||||
fn http_version<'s>(input: &mut Stream<'s>) -> PResult<&'s [u8]> {
|
||||
let _ = "HTTP/".parse_next(input)?;
|
||||
let version = take_while(1.., is_version).parse_next(input)?;
|
||||
|
||||
Ok(version)
|
||||
}
|
||||
|
||||
fn message_header_value<'s>(input: &mut Stream<'s>) -> PResult<&'s [u8]> {
|
||||
let _ = take_while(1.., is_horizontal_space).parse_next(input)?;
|
||||
let data = take_while(1.., till_line_ending).parse_next(input)?;
|
||||
let _ = line_ending.parse_next(input)?;
|
||||
|
||||
Ok(data)
|
||||
}
|
||||
|
||||
fn message_header<'s>(input: &mut Stream<'s>) -> PResult<Header<'s>> {
|
||||
seq!(Header {
|
||||
name: take_while(1.., is_token),
|
||||
_: ':',
|
||||
value: repeat(1.., message_header_value),
|
||||
})
|
||||
.parse_next(input)
|
||||
}
|
||||
|
||||
#[rustfmt::skip]
|
||||
#[allow(clippy::match_same_arms)]
|
||||
#[allow(clippy::match_like_matches_macro)]
|
||||
fn is_token(c: u8) -> bool {
|
||||
match c {
|
||||
128..=255 => false,
|
||||
0..=31 => false,
|
||||
b'(' => false,
|
||||
b')' => false,
|
||||
b'<' => false,
|
||||
b'>' => false,
|
||||
b'@' => false,
|
||||
b',' => false,
|
||||
b';' => false,
|
||||
b':' => false,
|
||||
b'\\' => false,
|
||||
b'"' => false,
|
||||
b'/' => false,
|
||||
b'[' => false,
|
||||
b']' => false,
|
||||
b'?' => false,
|
||||
b'=' => false,
|
||||
b'{' => false,
|
||||
b'}' => false,
|
||||
b' ' => false,
|
||||
_ => true,
|
||||
}
|
||||
}
|
||||
|
||||
fn is_version(c: u8) -> bool {
|
||||
c.is_ascii_digit() || c == b'.'
|
||||
}
|
||||
|
||||
fn till_line_ending(c: u8) -> bool {
|
||||
c != b'\r' && c != b'\n'
|
||||
}
|
||||
|
||||
fn is_space(c: u8) -> bool {
|
||||
c == b' '
|
||||
}
|
||||
|
||||
fn is_not_space(c: u8) -> bool {
|
||||
c != b' '
|
||||
}
|
||||
|
||||
fn is_horizontal_space(c: u8) -> bool {
|
||||
c == b' ' || c == b'\t'
|
||||
}
|
||||
138
third-party/vendor/winnow/examples/http/parser_streaming.rs
vendored
Normal file
138
third-party/vendor/winnow/examples/http/parser_streaming.rs
vendored
Normal file
|
|
@ -0,0 +1,138 @@
|
|||
use winnow::combinator::seq;
|
||||
use winnow::{
|
||||
ascii::line_ending, combinator::repeat, prelude::*, stream::Partial, token::take_while,
|
||||
};
|
||||
|
||||
pub type Stream<'i> = Partial<&'i [u8]>;
|
||||
|
||||
#[rustfmt::skip]
|
||||
#[derive(Debug)]
|
||||
#[allow(dead_code)]
|
||||
pub struct Request<'a> {
|
||||
method: &'a [u8],
|
||||
uri: &'a [u8],
|
||||
version: &'a [u8],
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
#[allow(dead_code)]
|
||||
pub struct Header<'a> {
|
||||
name: &'a [u8],
|
||||
value: Vec<&'a [u8]>,
|
||||
}
|
||||
|
||||
pub fn parse(data: &[u8]) -> Option<Vec<(Request<'_>, Vec<Header<'_>>)>> {
|
||||
let mut buf = Partial::new(data);
|
||||
let mut v = Vec::new();
|
||||
loop {
|
||||
match request(&mut buf) {
|
||||
Ok(r) => {
|
||||
v.push(r);
|
||||
|
||||
if buf.is_empty() {
|
||||
//println!("{}", i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
println!("error: {:?}", e);
|
||||
return None;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Some(v)
|
||||
}
|
||||
|
||||
fn request<'s>(input: &mut Stream<'s>) -> PResult<(Request<'s>, Vec<Header<'s>>)> {
|
||||
let req = request_line(input)?;
|
||||
let h = repeat(1.., message_header).parse_next(input)?;
|
||||
let _ = line_ending.parse_next(input)?;
|
||||
|
||||
Ok((req, h))
|
||||
}
|
||||
|
||||
fn request_line<'s>(input: &mut Stream<'s>) -> PResult<Request<'s>> {
|
||||
seq!( Request {
|
||||
method: take_while(1.., is_token),
|
||||
_: take_while(1.., is_space),
|
||||
uri: take_while(1.., is_not_space),
|
||||
_: take_while(1.., is_space),
|
||||
version: http_version,
|
||||
_: line_ending,
|
||||
})
|
||||
.parse_next(input)
|
||||
}
|
||||
|
||||
fn http_version<'s>(input: &mut Stream<'s>) -> PResult<&'s [u8]> {
|
||||
let _ = "HTTP/".parse_next(input)?;
|
||||
let version = take_while(1.., is_version).parse_next(input)?;
|
||||
|
||||
Ok(version)
|
||||
}
|
||||
|
||||
fn message_header_value<'s>(input: &mut Stream<'s>) -> PResult<&'s [u8]> {
|
||||
let _ = take_while(1.., is_horizontal_space).parse_next(input)?;
|
||||
let data = take_while(1.., till_line_ending).parse_next(input)?;
|
||||
let _ = line_ending.parse_next(input)?;
|
||||
|
||||
Ok(data)
|
||||
}
|
||||
|
||||
fn message_header<'s>(input: &mut Stream<'s>) -> PResult<Header<'s>> {
|
||||
seq!(Header {
|
||||
name: take_while(1.., is_token),
|
||||
_: ':',
|
||||
value: repeat(1.., message_header_value),
|
||||
})
|
||||
.parse_next(input)
|
||||
}
|
||||
|
||||
#[rustfmt::skip]
|
||||
#[allow(clippy::match_same_arms)]
|
||||
#[allow(clippy::match_like_matches_macro)]
|
||||
fn is_token(c: u8) -> bool {
|
||||
match c {
|
||||
128..=255 => false,
|
||||
0..=31 => false,
|
||||
b'(' => false,
|
||||
b')' => false,
|
||||
b'<' => false,
|
||||
b'>' => false,
|
||||
b'@' => false,
|
||||
b',' => false,
|
||||
b';' => false,
|
||||
b':' => false,
|
||||
b'\\' => false,
|
||||
b'"' => false,
|
||||
b'/' => false,
|
||||
b'[' => false,
|
||||
b']' => false,
|
||||
b'?' => false,
|
||||
b'=' => false,
|
||||
b'{' => false,
|
||||
b'}' => false,
|
||||
b' ' => false,
|
||||
_ => true,
|
||||
}
|
||||
}
|
||||
|
||||
fn is_version(c: u8) -> bool {
|
||||
c.is_ascii_digit() || c == b'.'
|
||||
}
|
||||
|
||||
fn till_line_ending(c: u8) -> bool {
|
||||
c != b'\r' && c != b'\n'
|
||||
}
|
||||
|
||||
fn is_space(c: u8) -> bool {
|
||||
c == b' '
|
||||
}
|
||||
|
||||
fn is_not_space(c: u8) -> bool {
|
||||
c != b' '
|
||||
}
|
||||
|
||||
fn is_horizontal_space(c: u8) -> bool {
|
||||
c == b' ' || c == b'\t'
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue