http2_tx_set_header(state, ":path".as_bytes(), slice)
}
-#[derive(Debug, PartialEq)]
-pub enum Http2Base64Error {
- InvalidBase64,
-}
-
-impl std::error::Error for Http2Base64Error {}
-
-impl std::fmt::Display for Http2Base64Error {
- fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
- write!(f, "invalid base64")
- }
-}
-
-fn http2_base64_map(input: u8) -> Result<u8, Http2Base64Error> {
- match input {
- 43 => Ok(62), // +
- 47 => Ok(63), // /
- 48 => Ok(52), // 0
- 49 => Ok(53), // 1
- 50 => Ok(54), // 2
- 51 => Ok(55), // 3
- 52 => Ok(56), // 4
- 53 => Ok(57), // 5
- 54 => Ok(58), // 6
- 55 => Ok(59), // 7
- 56 => Ok(60), // 8
- 57 => Ok(61), // 9
- 65 => Ok(0), // A
- 66 => Ok(1), // B
- 67 => Ok(2), // C
- 68 => Ok(3), // D
- 69 => Ok(4), // E
- 70 => Ok(5), // F
- 71 => Ok(6), // G
- 72 => Ok(7), // H
- 73 => Ok(8), // I
- 74 => Ok(9), // J
- 75 => Ok(10), // K
- 76 => Ok(11), // L
- 77 => Ok(12), // M
- 78 => Ok(13), // N
- 79 => Ok(14), // O
- 80 => Ok(15), // P
- 81 => Ok(16), // Q
- 82 => Ok(17), // R
- 83 => Ok(18), // S
- 84 => Ok(19), // T
- 85 => Ok(20), // U
- 86 => Ok(21), // V
- 87 => Ok(22), // W
- 88 => Ok(23), // X
- 89 => Ok(24), // Y
- 90 => Ok(25), // Z
- 97 => Ok(26), // a
- 98 => Ok(27), // b
- 99 => Ok(28), // c
- 100 => Ok(29), // d
- 101 => Ok(30), // e
- 102 => Ok(31), // f
- 103 => Ok(32), // g
- 104 => Ok(33), // h
- 105 => Ok(34), // i
- 106 => Ok(35), // j
- 107 => Ok(36), // k
- 108 => Ok(37), // l
- 109 => Ok(38), // m
- 110 => Ok(39), // n
- 111 => Ok(40), // o
- 112 => Ok(41), // p
- 113 => Ok(42), // q
- 114 => Ok(43), // r
- 115 => Ok(44), // s
- 116 => Ok(45), // t
- 117 => Ok(46), // u
- 118 => Ok(47), // v
- 119 => Ok(48), // w
- 120 => Ok(49), // x
- 121 => Ok(50), // y
- 122 => Ok(51), // z
- _ => Err(Http2Base64Error::InvalidBase64),
- }
-}
-
-fn http2_decode_base64(input: &[u8]) -> Result<Vec<u8>, Http2Base64Error> {
- if input.len() % 4 != 0 {
- return Err(Http2Base64Error::InvalidBase64);
- }
- let mut r = vec![0; (input.len() * 3) / 4];
- for i in 0..input.len() / 4 {
- let i1 = http2_base64_map(input[4 * i])?;
- let i2 = http2_base64_map(input[4 * i + 1])?;
- let i3 = http2_base64_map(input[4 * i + 2])?;
- let i4 = http2_base64_map(input[4 * i + 3])?;
- r[3 * i] = (i1 << 2) | (i2 >> 4);
- r[3 * i + 1] = (i2 << 4) | (i3 >> 2);
- r[3 * i + 2] = (i3 << 6) | i4;
- }
- return Ok(r);
-}
-
fn http2_tx_set_settings(state: &mut HTTP2State, input: &[u8]) {
- match http2_decode_base64(input) {
+ match base64::decode(input) {
Ok(dec) => {
if dec.len() % 6 != 0 {
state.set_event(HTTP2Event::InvalidHTTP1Settings);