rustfmt: add trailing commas in match arms, set fn call to block stle (#85)
This commit is contained in:
committed by
Carl Lerche
parent
de1edf4873
commit
f7d14861e5
@@ -186,7 +186,7 @@ impl Decoder {
|
||||
trace!(" Indexed; rem={:?}", src.remaining());
|
||||
can_resize = false;
|
||||
f(self.decode_indexed(src)?);
|
||||
}
|
||||
},
|
||||
LiteralWithIndexing => {
|
||||
trace!(" LiteralWithIndexing; rem={:?}", src.remaining());
|
||||
can_resize = false;
|
||||
@@ -196,13 +196,13 @@ impl Decoder {
|
||||
self.table.insert(entry.clone());
|
||||
|
||||
f(entry);
|
||||
}
|
||||
},
|
||||
LiteralWithoutIndexing => {
|
||||
trace!(" LiteralWithoutIndexing; rem={:?}", src.remaining());
|
||||
can_resize = false;
|
||||
let entry = self.decode_literal(src, false)?;
|
||||
f(entry);
|
||||
}
|
||||
},
|
||||
LiteralNeverIndexed => {
|
||||
trace!(" LiteralNeverIndexed; rem={:?}", src.remaining());
|
||||
can_resize = false;
|
||||
@@ -211,7 +211,7 @@ impl Decoder {
|
||||
// TODO: Track that this should never be indexed
|
||||
|
||||
f(entry);
|
||||
}
|
||||
},
|
||||
SizeUpdate => {
|
||||
trace!(" SizeUpdate; rem={:?}", src.remaining());
|
||||
if !can_resize {
|
||||
@@ -220,7 +220,7 @@ impl Decoder {
|
||||
|
||||
// Handle the dynamic table size update
|
||||
self.process_size_update(src)?;
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -234,9 +234,11 @@ impl Decoder {
|
||||
return Err(DecoderError::InvalidMaxDynamicSize);
|
||||
}
|
||||
|
||||
debug!("Decoder changed max table size from {} to {}",
|
||||
self.table.size(),
|
||||
new_size);
|
||||
debug!(
|
||||
"Decoder changed max table size from {} to {}",
|
||||
self.table.size(),
|
||||
new_size
|
||||
);
|
||||
|
||||
self.table.set_max_size(new_size);
|
||||
|
||||
@@ -287,9 +289,11 @@ impl Decoder {
|
||||
let len = decode_int(buf, 7)?;
|
||||
|
||||
if len > buf.remaining() {
|
||||
trace!("decode_string underflow; len={}; remaining={}",
|
||||
len,
|
||||
buf.remaining());
|
||||
trace!(
|
||||
"decode_string underflow; len={}; remaining={}",
|
||||
len,
|
||||
buf.remaining()
|
||||
);
|
||||
return Err(DecoderError::StringUnderflow);
|
||||
}
|
||||
|
||||
@@ -489,7 +493,7 @@ impl Table {
|
||||
// Can never happen as the size of the table must reach
|
||||
// 0 by the time we've exhausted all elements.
|
||||
panic!("Size of table != 0, but no headers left!");
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
self.size -= last.len();
|
||||
@@ -563,288 +567,194 @@ pub fn get_static(idx: usize) -> Header {
|
||||
12 => Header::Status(StatusCode::BAD_REQUEST),
|
||||
13 => Header::Status(StatusCode::NOT_FOUND),
|
||||
14 => Header::Status(StatusCode::INTERNAL_SERVER_ERROR),
|
||||
15 => {
|
||||
Header::Field {
|
||||
name: header::ACCEPT_CHARSET,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
16 => {
|
||||
Header::Field {
|
||||
name: header::ACCEPT_ENCODING,
|
||||
value: HeaderValue::from_static("gzip, deflate"),
|
||||
}
|
||||
}
|
||||
17 => {
|
||||
Header::Field {
|
||||
name: header::ACCEPT_LANGUAGE,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
18 => {
|
||||
Header::Field {
|
||||
name: header::ACCEPT_RANGES,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
19 => {
|
||||
Header::Field {
|
||||
name: header::ACCEPT,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
20 => {
|
||||
Header::Field {
|
||||
name: header::ACCESS_CONTROL_ALLOW_ORIGIN,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
21 => {
|
||||
Header::Field {
|
||||
name: header::AGE,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
22 => {
|
||||
Header::Field {
|
||||
name: header::ALLOW,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
23 => {
|
||||
Header::Field {
|
||||
name: header::AUTHORIZATION,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
24 => {
|
||||
Header::Field {
|
||||
name: header::CACHE_CONTROL,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
25 => {
|
||||
Header::Field {
|
||||
name: header::CONTENT_DISPOSITION,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
26 => {
|
||||
Header::Field {
|
||||
name: header::CONTENT_ENCODING,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
27 => {
|
||||
Header::Field {
|
||||
name: header::CONTENT_LANGUAGE,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
28 => {
|
||||
Header::Field {
|
||||
name: header::CONTENT_LENGTH,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
29 => {
|
||||
Header::Field {
|
||||
name: header::CONTENT_LOCATION,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
30 => {
|
||||
Header::Field {
|
||||
name: header::CONTENT_RANGE,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
31 => {
|
||||
Header::Field {
|
||||
name: header::CONTENT_TYPE,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
32 => {
|
||||
Header::Field {
|
||||
name: header::COOKIE,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
33 => {
|
||||
Header::Field {
|
||||
name: header::DATE,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
34 => {
|
||||
Header::Field {
|
||||
name: header::ETAG,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
35 => {
|
||||
Header::Field {
|
||||
name: header::EXPECT,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
36 => {
|
||||
Header::Field {
|
||||
name: header::EXPIRES,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
37 => {
|
||||
Header::Field {
|
||||
name: header::FROM,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
38 => {
|
||||
Header::Field {
|
||||
name: header::HOST,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
39 => {
|
||||
Header::Field {
|
||||
name: header::IF_MATCH,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
40 => {
|
||||
Header::Field {
|
||||
name: header::IF_MODIFIED_SINCE,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
41 => {
|
||||
Header::Field {
|
||||
name: header::IF_NONE_MATCH,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
42 => {
|
||||
Header::Field {
|
||||
name: header::IF_RANGE,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
43 => {
|
||||
Header::Field {
|
||||
name: header::IF_UNMODIFIED_SINCE,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
44 => {
|
||||
Header::Field {
|
||||
name: header::LAST_MODIFIED,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
45 => {
|
||||
Header::Field {
|
||||
name: header::LINK,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
46 => {
|
||||
Header::Field {
|
||||
name: header::LOCATION,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
47 => {
|
||||
Header::Field {
|
||||
name: header::MAX_FORWARDS,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
48 => {
|
||||
Header::Field {
|
||||
name: header::PROXY_AUTHENTICATE,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
49 => {
|
||||
Header::Field {
|
||||
name: header::PROXY_AUTHORIZATION,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
50 => {
|
||||
Header::Field {
|
||||
name: header::RANGE,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
51 => {
|
||||
Header::Field {
|
||||
name: header::REFERER,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
52 => {
|
||||
Header::Field {
|
||||
name: header::REFRESH,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
53 => {
|
||||
Header::Field {
|
||||
name: header::RETRY_AFTER,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
54 => {
|
||||
Header::Field {
|
||||
name: header::SERVER,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
55 => {
|
||||
Header::Field {
|
||||
name: header::SET_COOKIE,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
56 => {
|
||||
Header::Field {
|
||||
name: header::STRICT_TRANSPORT_SECURITY,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
57 => {
|
||||
Header::Field {
|
||||
name: header::TRANSFER_ENCODING,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
58 => {
|
||||
Header::Field {
|
||||
name: header::USER_AGENT,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
59 => {
|
||||
Header::Field {
|
||||
name: header::VARY,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
60 => {
|
||||
Header::Field {
|
||||
name: header::VIA,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
61 => {
|
||||
Header::Field {
|
||||
name: header::WWW_AUTHENTICATE,
|
||||
value: HeaderValue::from_static(""),
|
||||
}
|
||||
}
|
||||
15 => Header::Field {
|
||||
name: header::ACCEPT_CHARSET,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
16 => Header::Field {
|
||||
name: header::ACCEPT_ENCODING,
|
||||
value: HeaderValue::from_static("gzip, deflate"),
|
||||
},
|
||||
17 => Header::Field {
|
||||
name: header::ACCEPT_LANGUAGE,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
18 => Header::Field {
|
||||
name: header::ACCEPT_RANGES,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
19 => Header::Field {
|
||||
name: header::ACCEPT,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
20 => Header::Field {
|
||||
name: header::ACCESS_CONTROL_ALLOW_ORIGIN,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
21 => Header::Field {
|
||||
name: header::AGE,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
22 => Header::Field {
|
||||
name: header::ALLOW,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
23 => Header::Field {
|
||||
name: header::AUTHORIZATION,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
24 => Header::Field {
|
||||
name: header::CACHE_CONTROL,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
25 => Header::Field {
|
||||
name: header::CONTENT_DISPOSITION,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
26 => Header::Field {
|
||||
name: header::CONTENT_ENCODING,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
27 => Header::Field {
|
||||
name: header::CONTENT_LANGUAGE,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
28 => Header::Field {
|
||||
name: header::CONTENT_LENGTH,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
29 => Header::Field {
|
||||
name: header::CONTENT_LOCATION,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
30 => Header::Field {
|
||||
name: header::CONTENT_RANGE,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
31 => Header::Field {
|
||||
name: header::CONTENT_TYPE,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
32 => Header::Field {
|
||||
name: header::COOKIE,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
33 => Header::Field {
|
||||
name: header::DATE,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
34 => Header::Field {
|
||||
name: header::ETAG,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
35 => Header::Field {
|
||||
name: header::EXPECT,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
36 => Header::Field {
|
||||
name: header::EXPIRES,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
37 => Header::Field {
|
||||
name: header::FROM,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
38 => Header::Field {
|
||||
name: header::HOST,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
39 => Header::Field {
|
||||
name: header::IF_MATCH,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
40 => Header::Field {
|
||||
name: header::IF_MODIFIED_SINCE,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
41 => Header::Field {
|
||||
name: header::IF_NONE_MATCH,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
42 => Header::Field {
|
||||
name: header::IF_RANGE,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
43 => Header::Field {
|
||||
name: header::IF_UNMODIFIED_SINCE,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
44 => Header::Field {
|
||||
name: header::LAST_MODIFIED,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
45 => Header::Field {
|
||||
name: header::LINK,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
46 => Header::Field {
|
||||
name: header::LOCATION,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
47 => Header::Field {
|
||||
name: header::MAX_FORWARDS,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
48 => Header::Field {
|
||||
name: header::PROXY_AUTHENTICATE,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
49 => Header::Field {
|
||||
name: header::PROXY_AUTHORIZATION,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
50 => Header::Field {
|
||||
name: header::RANGE,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
51 => Header::Field {
|
||||
name: header::REFERER,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
52 => Header::Field {
|
||||
name: header::REFRESH,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
53 => Header::Field {
|
||||
name: header::RETRY_AFTER,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
54 => Header::Field {
|
||||
name: header::SERVER,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
55 => Header::Field {
|
||||
name: header::SET_COOKIE,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
56 => Header::Field {
|
||||
name: header::STRICT_TRANSPORT_SECURITY,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
57 => Header::Field {
|
||||
name: header::TRANSFER_ENCODING,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
58 => Header::Field {
|
||||
name: header::USER_AGENT,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
59 => Header::Field {
|
||||
name: header::VARY,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
60 => Header::Field {
|
||||
name: header::VIA,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
61 => Header::Field {
|
||||
name: header::WWW_AUTHENTICATE,
|
||||
value: HeaderValue::from_static(""),
|
||||
},
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,31 +47,27 @@ impl Encoder {
|
||||
#[allow(dead_code)]
|
||||
pub fn update_max_size(&mut self, val: usize) {
|
||||
match self.size_update {
|
||||
Some(SizeUpdate::One(old)) => {
|
||||
if val > old {
|
||||
if old > self.table.max_size() {
|
||||
self.size_update = Some(SizeUpdate::One(val));
|
||||
} else {
|
||||
self.size_update = Some(SizeUpdate::Two(old, val));
|
||||
}
|
||||
} else {
|
||||
self.size_update = Some(SizeUpdate::One(val));
|
||||
}
|
||||
}
|
||||
Some(SizeUpdate::Two(min, _)) => {
|
||||
if val < min {
|
||||
Some(SizeUpdate::One(old)) => if val > old {
|
||||
if old > self.table.max_size() {
|
||||
self.size_update = Some(SizeUpdate::One(val));
|
||||
} else {
|
||||
self.size_update = Some(SizeUpdate::Two(min, val));
|
||||
self.size_update = Some(SizeUpdate::Two(old, val));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
self.size_update = Some(SizeUpdate::One(val));
|
||||
},
|
||||
Some(SizeUpdate::Two(min, _)) => if val < min {
|
||||
self.size_update = Some(SizeUpdate::One(val));
|
||||
} else {
|
||||
self.size_update = Some(SizeUpdate::Two(min, val));
|
||||
},
|
||||
None => {
|
||||
if val != self.table.max_size() {
|
||||
// Don't bother writing a frame if the value already matches
|
||||
// the table's max size.
|
||||
self.size_update = Some(SizeUpdate::One(val));
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,13 +120,13 @@ impl Encoder {
|
||||
if res.is_err() {
|
||||
dst.truncate(len);
|
||||
return Encode::Partial(EncodeState {
|
||||
index: index,
|
||||
value: None,
|
||||
});
|
||||
index: index,
|
||||
value: None,
|
||||
});
|
||||
}
|
||||
|
||||
last_index = Some(index);
|
||||
}
|
||||
},
|
||||
// The header does not have an associated name. This means that
|
||||
// the name is the same as the previously yielded header. In
|
||||
// which case, we skip table lookup and just use the same index
|
||||
@@ -142,11 +138,11 @@ impl Encoder {
|
||||
if res.is_err() {
|
||||
dst.truncate(len);
|
||||
return Encode::Partial(EncodeState {
|
||||
index: last_index.unwrap(),
|
||||
value: Some(value),
|
||||
});
|
||||
index: last_index.unwrap(),
|
||||
value: Some(value),
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -158,14 +154,14 @@ impl Encoder {
|
||||
Some(SizeUpdate::One(val)) => {
|
||||
self.table.resize(val);
|
||||
encode_size_update(val, dst)?;
|
||||
}
|
||||
},
|
||||
Some(SizeUpdate::Two(min, max)) => {
|
||||
self.table.resize(min);
|
||||
self.table.resize(max);
|
||||
encode_size_update(min, dst)?;
|
||||
encode_size_update(max, dst)?;
|
||||
}
|
||||
None => {}
|
||||
},
|
||||
None => {},
|
||||
}
|
||||
|
||||
Ok(())
|
||||
@@ -175,12 +171,12 @@ impl Encoder {
|
||||
match *index {
|
||||
Index::Indexed(idx, _) => {
|
||||
encode_int(idx, 7, 0x80, dst)?;
|
||||
}
|
||||
},
|
||||
Index::Name(idx, _) => {
|
||||
let header = self.table.resolve(&index);
|
||||
|
||||
encode_not_indexed(idx, header.value_slice(), header.is_sensitive(), dst)?;
|
||||
}
|
||||
},
|
||||
Index::Inserted(_) => {
|
||||
let header = self.table.resolve(&index);
|
||||
|
||||
@@ -194,7 +190,7 @@ impl Encoder {
|
||||
|
||||
encode_str(header.name().as_slice(), dst)?;
|
||||
encode_str(header.value_slice(), dst)?;
|
||||
}
|
||||
},
|
||||
Index::InsertedValue(idx, _) => {
|
||||
let header = self.table.resolve(&index);
|
||||
|
||||
@@ -202,15 +198,17 @@ impl Encoder {
|
||||
|
||||
encode_int(idx, 6, 0b01000000, dst)?;
|
||||
encode_str(header.value_slice(), dst)?;
|
||||
}
|
||||
},
|
||||
Index::NotIndexed(_) => {
|
||||
let header = self.table.resolve(&index);
|
||||
|
||||
encode_not_indexed2(header.name().as_slice(),
|
||||
header.value_slice(),
|
||||
header.is_sensitive(),
|
||||
dst)?;
|
||||
}
|
||||
encode_not_indexed2(
|
||||
header.name().as_slice(),
|
||||
header.value_slice(),
|
||||
header.is_sensitive(),
|
||||
dst,
|
||||
)?;
|
||||
},
|
||||
}
|
||||
|
||||
Ok(())
|
||||
@@ -230,15 +228,17 @@ impl Encoder {
|
||||
let idx = self.table.resolve_idx(last);
|
||||
|
||||
encode_not_indexed(idx, value.as_ref(), value.is_sensitive(), dst)?;
|
||||
}
|
||||
},
|
||||
Index::NotIndexed(_) => {
|
||||
let last = self.table.resolve(last);
|
||||
|
||||
encode_not_indexed2(last.name().as_slice(),
|
||||
value.as_ref(),
|
||||
value.is_sensitive(),
|
||||
dst)?;
|
||||
}
|
||||
encode_not_indexed2(
|
||||
last.name().as_slice(),
|
||||
value.as_ref(),
|
||||
value.is_sensitive(),
|
||||
dst,
|
||||
)?;
|
||||
},
|
||||
}
|
||||
|
||||
Ok(())
|
||||
@@ -570,8 +570,10 @@ mod test {
|
||||
// Using the name component of a previously indexed header (without
|
||||
// sensitive flag set)
|
||||
|
||||
let _ = encode(&mut encoder,
|
||||
vec![self::header("my-password", "not-so-secret")]);
|
||||
let _ = encode(
|
||||
&mut encoder,
|
||||
vec![self::header("my-password", "not-so-secret")],
|
||||
);
|
||||
|
||||
let name = "my-password".parse().unwrap();
|
||||
let mut value = HeaderValue::from_bytes(b"12345").unwrap();
|
||||
@@ -794,7 +796,7 @@ mod test {
|
||||
dst.clear();
|
||||
|
||||
match encoder.encode(Some(resume), &mut input, &mut dst) {
|
||||
Encode::Full => {}
|
||||
Encode::Full => {},
|
||||
_ => panic!(),
|
||||
}
|
||||
|
||||
|
||||
@@ -38,25 +38,23 @@ impl Header<Option<HeaderName>> {
|
||||
use self::Header::*;
|
||||
|
||||
Ok(match self {
|
||||
Field {
|
||||
name: Some(n),
|
||||
value,
|
||||
} => {
|
||||
Field {
|
||||
name: n,
|
||||
value: value,
|
||||
}
|
||||
}
|
||||
Field {
|
||||
name: None,
|
||||
value,
|
||||
} => return Err(value),
|
||||
Authority(v) => Authority(v),
|
||||
Method(v) => Method(v),
|
||||
Scheme(v) => Scheme(v),
|
||||
Path(v) => Path(v),
|
||||
Status(v) => Status(v),
|
||||
})
|
||||
Field {
|
||||
name: Some(n),
|
||||
value,
|
||||
} => Field {
|
||||
name: n,
|
||||
value: value,
|
||||
},
|
||||
Field {
|
||||
name: None,
|
||||
value,
|
||||
} => return Err(value),
|
||||
Authority(v) => Authority(v),
|
||||
Method(v) => Method(v),
|
||||
Scheme(v) => Scheme(v),
|
||||
Path(v) => Path(v),
|
||||
Status(v) => Status(v),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,23 +65,23 @@ impl Header {
|
||||
b"authority" => {
|
||||
let value = String::try_from(value)?;
|
||||
Ok(Header::Authority(value))
|
||||
}
|
||||
},
|
||||
b"method" => {
|
||||
let method = Method::from_bytes(&value)?;
|
||||
Ok(Header::Method(method))
|
||||
}
|
||||
},
|
||||
b"scheme" => {
|
||||
let value = String::try_from(value)?;
|
||||
Ok(Header::Scheme(value))
|
||||
}
|
||||
},
|
||||
b"path" => {
|
||||
let value = String::try_from(value)?;
|
||||
Ok(Header::Path(value))
|
||||
}
|
||||
},
|
||||
b"status" => {
|
||||
let status = StatusCode::from_bytes(&value)?;
|
||||
Ok(Header::Status(status))
|
||||
}
|
||||
},
|
||||
_ => Err(DecoderError::InvalidPseudoheader),
|
||||
}
|
||||
} else {
|
||||
@@ -92,9 +90,9 @@ impl Header {
|
||||
let value = HeaderValue::from_bytes(&value)?;
|
||||
|
||||
Ok(Header::Field {
|
||||
name: name,
|
||||
value: value,
|
||||
})
|
||||
name: name,
|
||||
value: value,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,37 +149,27 @@ impl Header {
|
||||
} => a == value,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
Header::Authority(ref a) => {
|
||||
match *other {
|
||||
Header::Authority(ref b) => a == b,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
Header::Method(ref a) => {
|
||||
match *other {
|
||||
Header::Method(ref b) => a == b,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
Header::Scheme(ref a) => {
|
||||
match *other {
|
||||
Header::Scheme(ref b) => a == b,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
Header::Path(ref a) => {
|
||||
match *other {
|
||||
Header::Path(ref b) => a == b,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
Header::Status(ref a) => {
|
||||
match *other {
|
||||
Header::Status(ref b) => a == b,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
},
|
||||
Header::Authority(ref a) => match *other {
|
||||
Header::Authority(ref b) => a == b,
|
||||
_ => false,
|
||||
},
|
||||
Header::Method(ref a) => match *other {
|
||||
Header::Method(ref b) => a == b,
|
||||
_ => false,
|
||||
},
|
||||
Header::Scheme(ref a) => match *other {
|
||||
Header::Scheme(ref b) => a == b,
|
||||
_ => false,
|
||||
},
|
||||
Header::Path(ref a) => match *other {
|
||||
Header::Path(ref b) => a == b,
|
||||
_ => false,
|
||||
},
|
||||
Header::Status(ref a) => match *other {
|
||||
Header::Status(ref b) => a == b,
|
||||
_ => false,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,20 +189,18 @@ impl Header {
|
||||
match *self {
|
||||
Header::Field {
|
||||
ref name, ..
|
||||
} => {
|
||||
match *name {
|
||||
header::AGE |
|
||||
header::AUTHORIZATION |
|
||||
header::CONTENT_LENGTH |
|
||||
header::ETAG |
|
||||
header::IF_MODIFIED_SINCE |
|
||||
header::IF_NONE_MATCH |
|
||||
header::LOCATION |
|
||||
header::COOKIE |
|
||||
header::SET_COOKIE => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
} => match *name {
|
||||
header::AGE |
|
||||
header::AUTHORIZATION |
|
||||
header::CONTENT_LENGTH |
|
||||
header::ETAG |
|
||||
header::IF_MODIFIED_SINCE |
|
||||
header::IF_NONE_MATCH |
|
||||
header::LOCATION |
|
||||
header::COOKIE |
|
||||
header::SET_COOKIE => true,
|
||||
_ => false,
|
||||
},
|
||||
Header::Path(..) => true,
|
||||
_ => false,
|
||||
}
|
||||
@@ -228,12 +214,10 @@ impl From<Header> for Header<Option<HeaderName>> {
|
||||
Header::Field {
|
||||
name,
|
||||
value,
|
||||
} => {
|
||||
Header::Field {
|
||||
name: Some(name),
|
||||
value,
|
||||
}
|
||||
}
|
||||
} => Header::Field {
|
||||
name: Some(name),
|
||||
value,
|
||||
},
|
||||
Header::Authority(v) => Header::Authority(v),
|
||||
Header::Method(v) => Header::Method(v),
|
||||
Header::Scheme(v) => Header::Scheme(v),
|
||||
@@ -246,12 +230,10 @@ impl From<Header> for Header<Option<HeaderName>> {
|
||||
impl<'a> Name<'a> {
|
||||
pub fn into_entry(self, value: Bytes) -> Result<Header, DecoderError> {
|
||||
match self {
|
||||
Name::Field(name) => {
|
||||
Ok(Header::Field {
|
||||
name: name.clone(),
|
||||
value: HeaderValue::from_bytes(&*value)?,
|
||||
})
|
||||
}
|
||||
Name::Field(name) => Ok(Header::Field {
|
||||
name: name.clone(),
|
||||
value: HeaderValue::from_bytes(&*value)?,
|
||||
}),
|
||||
Name::Authority => Ok(Header::Authority(String::try_from(value)?)),
|
||||
Name::Method => Ok(Header::Method(Method::from_bytes(&*value)?)),
|
||||
Name::Scheme => Ok(Header::Scheme(String::try_from(value)?)),
|
||||
@@ -262,7 +244,7 @@ impl<'a> Name<'a> {
|
||||
// TODO: better error handling
|
||||
Err(_) => Err(DecoderError::InvalidStatusCode),
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -292,11 +292,13 @@ impl Table {
|
||||
|
||||
let pos_idx = 0usize.wrapping_sub(self.inserted);
|
||||
|
||||
let prev = mem::replace(&mut self.indices[probe],
|
||||
Some(Pos {
|
||||
index: pos_idx,
|
||||
hash: hash,
|
||||
}));
|
||||
let prev = mem::replace(
|
||||
&mut self.indices[probe],
|
||||
Some(Pos {
|
||||
index: pos_idx,
|
||||
hash: hash,
|
||||
}),
|
||||
);
|
||||
|
||||
if let Some(mut prev) = prev {
|
||||
// Shift forward
|
||||
@@ -325,10 +327,10 @@ impl Table {
|
||||
self.inserted = self.inserted.wrapping_add(1);
|
||||
|
||||
self.slots.push_front(Slot {
|
||||
hash: hash,
|
||||
header: header,
|
||||
next: None,
|
||||
});
|
||||
hash: hash,
|
||||
header: header,
|
||||
next: None,
|
||||
});
|
||||
}
|
||||
|
||||
pub fn resize(&mut self, size: usize) {
|
||||
@@ -377,12 +379,14 @@ impl Table {
|
||||
// Update the size
|
||||
self.size -= slot.header.len();
|
||||
|
||||
debug_assert_eq!(self.indices
|
||||
.iter()
|
||||
.filter_map(|p| *p)
|
||||
.filter(|p| p.index == pos_idx)
|
||||
.count(),
|
||||
1);
|
||||
debug_assert_eq!(
|
||||
self.indices
|
||||
.iter()
|
||||
.filter_map(|p| *p)
|
||||
.filter(|p| p.index == pos_idx)
|
||||
.count(),
|
||||
1
|
||||
);
|
||||
|
||||
// Find the associated position
|
||||
probe_loop!(probe < self.indices.len(), {
|
||||
@@ -495,12 +499,12 @@ impl Table {
|
||||
}
|
||||
|
||||
debug_assert!({
|
||||
let them = self.indices[probe].unwrap();
|
||||
let their_distance = probe_distance(self.mask, them.hash, probe);
|
||||
let our_distance = probe_distance(self.mask, pos.hash, probe);
|
||||
let them = self.indices[probe].unwrap();
|
||||
let their_distance = probe_distance(self.mask, them.hash, probe);
|
||||
let our_distance = probe_distance(self.mask, pos.hash, probe);
|
||||
|
||||
their_distance >= our_distance
|
||||
});
|
||||
their_distance >= our_distance
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -661,97 +665,85 @@ fn index_static(header: &Header) -> Option<(usize, bool)> {
|
||||
Header::Field {
|
||||
ref name,
|
||||
ref value,
|
||||
} => {
|
||||
match *name {
|
||||
header::ACCEPT_CHARSET => Some((15, false)),
|
||||
header::ACCEPT_ENCODING => {
|
||||
if value == "gzip, deflate" {
|
||||
Some((16, true))
|
||||
} else {
|
||||
Some((16, false))
|
||||
}
|
||||
}
|
||||
header::ACCEPT_LANGUAGE => Some((17, false)),
|
||||
header::ACCEPT_RANGES => Some((18, false)),
|
||||
header::ACCEPT => Some((19, false)),
|
||||
header::ACCESS_CONTROL_ALLOW_ORIGIN => Some((20, false)),
|
||||
header::AGE => Some((21, false)),
|
||||
header::ALLOW => Some((22, false)),
|
||||
header::AUTHORIZATION => Some((23, false)),
|
||||
header::CACHE_CONTROL => Some((24, false)),
|
||||
header::CONTENT_DISPOSITION => Some((25, false)),
|
||||
header::CONTENT_ENCODING => Some((26, false)),
|
||||
header::CONTENT_LANGUAGE => Some((27, false)),
|
||||
header::CONTENT_LENGTH => Some((28, false)),
|
||||
header::CONTENT_LOCATION => Some((29, false)),
|
||||
header::CONTENT_RANGE => Some((30, false)),
|
||||
header::CONTENT_TYPE => Some((31, false)),
|
||||
header::COOKIE => Some((32, false)),
|
||||
header::DATE => Some((33, false)),
|
||||
header::ETAG => Some((34, false)),
|
||||
header::EXPECT => Some((35, false)),
|
||||
header::EXPIRES => Some((36, false)),
|
||||
header::FROM => Some((37, false)),
|
||||
header::HOST => Some((38, false)),
|
||||
header::IF_MATCH => Some((39, false)),
|
||||
header::IF_MODIFIED_SINCE => Some((40, false)),
|
||||
header::IF_NONE_MATCH => Some((41, false)),
|
||||
header::IF_RANGE => Some((42, false)),
|
||||
header::IF_UNMODIFIED_SINCE => Some((43, false)),
|
||||
header::LAST_MODIFIED => Some((44, false)),
|
||||
header::LINK => Some((45, false)),
|
||||
header::LOCATION => Some((46, false)),
|
||||
header::MAX_FORWARDS => Some((47, false)),
|
||||
header::PROXY_AUTHENTICATE => Some((48, false)),
|
||||
header::PROXY_AUTHORIZATION => Some((49, false)),
|
||||
header::RANGE => Some((50, false)),
|
||||
header::REFERER => Some((51, false)),
|
||||
header::REFRESH => Some((52, false)),
|
||||
header::RETRY_AFTER => Some((53, false)),
|
||||
header::SERVER => Some((54, false)),
|
||||
header::SET_COOKIE => Some((55, false)),
|
||||
header::STRICT_TRANSPORT_SECURITY => Some((56, false)),
|
||||
header::TRANSFER_ENCODING => Some((57, false)),
|
||||
header::USER_AGENT => Some((58, false)),
|
||||
header::VARY => Some((59, false)),
|
||||
header::VIA => Some((60, false)),
|
||||
header::WWW_AUTHENTICATE => Some((61, false)),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
} => match *name {
|
||||
header::ACCEPT_CHARSET => Some((15, false)),
|
||||
header::ACCEPT_ENCODING => if value == "gzip, deflate" {
|
||||
Some((16, true))
|
||||
} else {
|
||||
Some((16, false))
|
||||
},
|
||||
header::ACCEPT_LANGUAGE => Some((17, false)),
|
||||
header::ACCEPT_RANGES => Some((18, false)),
|
||||
header::ACCEPT => Some((19, false)),
|
||||
header::ACCESS_CONTROL_ALLOW_ORIGIN => Some((20, false)),
|
||||
header::AGE => Some((21, false)),
|
||||
header::ALLOW => Some((22, false)),
|
||||
header::AUTHORIZATION => Some((23, false)),
|
||||
header::CACHE_CONTROL => Some((24, false)),
|
||||
header::CONTENT_DISPOSITION => Some((25, false)),
|
||||
header::CONTENT_ENCODING => Some((26, false)),
|
||||
header::CONTENT_LANGUAGE => Some((27, false)),
|
||||
header::CONTENT_LENGTH => Some((28, false)),
|
||||
header::CONTENT_LOCATION => Some((29, false)),
|
||||
header::CONTENT_RANGE => Some((30, false)),
|
||||
header::CONTENT_TYPE => Some((31, false)),
|
||||
header::COOKIE => Some((32, false)),
|
||||
header::DATE => Some((33, false)),
|
||||
header::ETAG => Some((34, false)),
|
||||
header::EXPECT => Some((35, false)),
|
||||
header::EXPIRES => Some((36, false)),
|
||||
header::FROM => Some((37, false)),
|
||||
header::HOST => Some((38, false)),
|
||||
header::IF_MATCH => Some((39, false)),
|
||||
header::IF_MODIFIED_SINCE => Some((40, false)),
|
||||
header::IF_NONE_MATCH => Some((41, false)),
|
||||
header::IF_RANGE => Some((42, false)),
|
||||
header::IF_UNMODIFIED_SINCE => Some((43, false)),
|
||||
header::LAST_MODIFIED => Some((44, false)),
|
||||
header::LINK => Some((45, false)),
|
||||
header::LOCATION => Some((46, false)),
|
||||
header::MAX_FORWARDS => Some((47, false)),
|
||||
header::PROXY_AUTHENTICATE => Some((48, false)),
|
||||
header::PROXY_AUTHORIZATION => Some((49, false)),
|
||||
header::RANGE => Some((50, false)),
|
||||
header::REFERER => Some((51, false)),
|
||||
header::REFRESH => Some((52, false)),
|
||||
header::RETRY_AFTER => Some((53, false)),
|
||||
header::SERVER => Some((54, false)),
|
||||
header::SET_COOKIE => Some((55, false)),
|
||||
header::STRICT_TRANSPORT_SECURITY => Some((56, false)),
|
||||
header::TRANSFER_ENCODING => Some((57, false)),
|
||||
header::USER_AGENT => Some((58, false)),
|
||||
header::VARY => Some((59, false)),
|
||||
header::VIA => Some((60, false)),
|
||||
header::WWW_AUTHENTICATE => Some((61, false)),
|
||||
_ => None,
|
||||
},
|
||||
Header::Authority(_) => Some((1, false)),
|
||||
Header::Method(ref v) => {
|
||||
match *v {
|
||||
Method::GET => Some((2, true)),
|
||||
Method::POST => Some((3, true)),
|
||||
_ => Some((2, false)),
|
||||
}
|
||||
}
|
||||
Header::Scheme(ref v) => {
|
||||
match &**v {
|
||||
"http" => Some((6, true)),
|
||||
"https" => Some((7, true)),
|
||||
_ => Some((6, false)),
|
||||
}
|
||||
}
|
||||
Header::Path(ref v) => {
|
||||
match &**v {
|
||||
"/" => Some((4, true)),
|
||||
"/index.html" => Some((5, true)),
|
||||
_ => Some((4, false)),
|
||||
}
|
||||
}
|
||||
Header::Status(ref v) => {
|
||||
match u16::from(*v) {
|
||||
200 => Some((8, true)),
|
||||
204 => Some((9, true)),
|
||||
206 => Some((10, true)),
|
||||
304 => Some((11, true)),
|
||||
400 => Some((12, true)),
|
||||
404 => Some((13, true)),
|
||||
500 => Some((14, true)),
|
||||
_ => Some((8, false)),
|
||||
}
|
||||
}
|
||||
Header::Method(ref v) => match *v {
|
||||
Method::GET => Some((2, true)),
|
||||
Method::POST => Some((3, true)),
|
||||
_ => Some((2, false)),
|
||||
},
|
||||
Header::Scheme(ref v) => match &**v {
|
||||
"http" => Some((6, true)),
|
||||
"https" => Some((7, true)),
|
||||
_ => Some((6, false)),
|
||||
},
|
||||
Header::Path(ref v) => match &**v {
|
||||
"/" => Some((4, true)),
|
||||
"/index.html" => Some((5, true)),
|
||||
_ => Some((4, false)),
|
||||
},
|
||||
Header::Status(ref v) => match u16::from(*v) {
|
||||
200 => Some((8, true)),
|
||||
204 => Some((9, true)),
|
||||
206 => Some((10, true)),
|
||||
304 => Some((11, true)),
|
||||
400 => Some((12, true)),
|
||||
404 => Some((13, true)),
|
||||
500 => Some((14, true)),
|
||||
_ => Some((8, false)),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,11 +81,11 @@ impl FuzzHpack {
|
||||
let low = rng.gen_range(0, high);
|
||||
|
||||
frame.resizes.extend(&[low, high]);
|
||||
}
|
||||
},
|
||||
1...3 => {
|
||||
frame.resizes.push(rng.gen_range(128, MAX_CHUNK * 2));
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
_ => {},
|
||||
}
|
||||
|
||||
for _ in 0..rng.gen_range(1, (num - added) + 1) {
|
||||
@@ -155,7 +155,7 @@ impl FuzzHpack {
|
||||
.unwrap();
|
||||
|
||||
buf = BytesMut::with_capacity(chunks.pop().unwrap_or(MAX_CHUNK));
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -185,7 +185,7 @@ fn gen_header(g: &mut StdRng) -> Header<Option<HeaderName>> {
|
||||
0 => {
|
||||
let value = gen_string(g, 4, 20);
|
||||
Header::Authority(to_shared(value))
|
||||
}
|
||||
},
|
||||
1 => {
|
||||
let method = match g.next_u32() % 6 {
|
||||
0 => Method::GET,
|
||||
@@ -200,12 +200,12 @@ fn gen_header(g: &mut StdRng) -> Header<Option<HeaderName>> {
|
||||
.collect();
|
||||
|
||||
Method::from_bytes(&bytes).unwrap()
|
||||
}
|
||||
},
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
Header::Method(method)
|
||||
}
|
||||
},
|
||||
2 => {
|
||||
let value = match g.next_u32() % 2 {
|
||||
0 => "http",
|
||||
@@ -214,7 +214,7 @@ fn gen_header(g: &mut StdRng) -> Header<Option<HeaderName>> {
|
||||
};
|
||||
|
||||
Header::Scheme(to_shared(value.to_string()))
|
||||
}
|
||||
},
|
||||
3 => {
|
||||
let value = match g.next_u32() % 100 {
|
||||
0 => "/".to_string(),
|
||||
@@ -223,12 +223,12 @@ fn gen_header(g: &mut StdRng) -> Header<Option<HeaderName>> {
|
||||
};
|
||||
|
||||
Header::Path(to_shared(value))
|
||||
}
|
||||
},
|
||||
4 => {
|
||||
let status = (g.gen::<u16>() % 500) + 100;
|
||||
|
||||
Header::Status(StatusCode::from_u16(status).unwrap())
|
||||
}
|
||||
},
|
||||
_ => unreachable!(),
|
||||
}
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user