1
0
mirror of https://github.com/fafhrd91/actix-web synced 2024-11-28 10:02:38 +01:00
actix-web/actix-http/src/header/mod.rs

102 lines
2.1 KiB
Rust
Raw Normal View History

2021-02-09 23:59:17 +01:00
//! Typed HTTP headers, pre-defined `HeaderName`s, traits for parsing and conversion, and other
2021-01-15 03:11:10 +01:00
//! header utility methods.
2019-02-07 22:24:24 +01:00
2021-01-15 03:11:10 +01:00
use std::fmt;
2019-02-07 22:24:24 +01:00
use bytes::{Bytes, BytesMut};
2019-08-13 19:48:11 +02:00
use percent_encoding::{AsciiSet, CONTROLS};
2019-02-07 22:24:24 +01:00
pub use http::header::*;
use crate::error::ParseError;
use crate::httpmessage::HttpMessage;
2021-02-09 23:59:17 +01:00
mod as_name;
2021-01-15 03:11:10 +01:00
mod into_pair;
mod into_value;
mod utils;
2019-02-07 22:24:24 +01:00
mod common;
pub(crate) mod map;
2019-02-07 22:24:24 +01:00
mod shared;
2021-01-15 03:11:10 +01:00
2019-02-07 22:24:24 +01:00
pub use self::common::*;
#[doc(hidden)]
pub use self::shared::*;
2021-02-09 23:59:17 +01:00
pub use self::as_name::AsHeaderName;
2021-01-15 03:11:10 +01:00
pub use self::into_pair::IntoHeaderPair;
pub use self::into_value::IntoHeaderValue;
#[doc(hidden)]
pub use self::map::GetAll;
pub use self::map::HeaderMap;
2021-01-15 03:11:10 +01:00
pub use self::utils::*;
2021-01-15 03:11:10 +01:00
/// A trait for any object that already represents a valid header field and value.
pub trait Header: IntoHeaderValue {
2019-02-07 22:24:24 +01:00
/// Returns the name of the header field
fn name() -> HeaderName;
/// Parse a header
fn parse<T: HttpMessage>(msg: &T) -> Result<Self, ParseError>;
}
2021-02-09 23:59:17 +01:00
#[derive(Debug, Default)]
2019-02-07 22:24:24 +01:00
pub(crate) struct Writer {
buf: BytesMut,
}
impl Writer {
fn new() -> Writer {
2021-02-09 23:59:17 +01:00
Writer::default()
2019-02-07 22:24:24 +01:00
}
2021-01-15 03:11:10 +01:00
2019-02-07 22:24:24 +01:00
fn take(&mut self) -> Bytes {
2019-12-05 18:35:43 +01:00
self.buf.split().freeze()
2019-02-07 22:24:24 +01:00
}
}
impl fmt::Write for Writer {
#[inline]
fn write_str(&mut self, s: &str) -> fmt::Result {
self.buf.extend_from_slice(s.as_bytes());
Ok(())
}
#[inline]
2019-12-07 19:46:51 +01:00
fn write_fmt(&mut self, args: fmt::Arguments<'_>) -> fmt::Result {
2019-02-07 22:24:24 +01:00
fmt::write(self, args)
}
}
2021-01-15 03:11:10 +01:00
/// Convert `http::HeaderMap` to our `HeaderMap`.
impl From<http::HeaderMap> for HeaderMap {
2021-02-09 23:59:17 +01:00
fn from(mut map: http::HeaderMap) -> HeaderMap {
HeaderMap::from_drain(map.drain())
}
}
2021-01-15 06:38:50 +01:00
/// This encode set is used for HTTP header values and is defined at
/// https://tools.ietf.org/html/rfc5987#section-3.2.
2019-08-13 19:48:11 +02:00
pub(crate) const HTTP_VALUE: &AsciiSet = &CONTROLS
.add(b' ')
.add(b'"')
.add(b'%')
.add(b'\'')
.add(b'(')
.add(b')')
.add(b'*')
.add(b',')
.add(b'/')
.add(b':')
.add(b';')
.add(b'<')
.add(b'-')
.add(b'>')
.add(b'?')
.add(b'[')
.add(b'\\')
.add(b']')
.add(b'{')
.add(b'}');