Skip to content

Commit 103cdfa

Browse files
feat: implement extensions
1 parent 5afcc8c commit 103cdfa

File tree

5 files changed

+88
-2
lines changed

5 files changed

+88
-2
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ omnom = "2.1.1"
2626
# features: hyperium/http
2727
http = { version = "0.2.0", optional = true }
2828
anyhow = "1.0.26"
29+
type-map = "0.2.0"
2930

3031
[dev-dependencies]
3132
http = "0.2.0"

src/headers/constants.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,31 @@ pub const TRANSFER_ENCODING: HeaderName = HeaderName::from_lowercase_str("transf
1717

1818
/// The `Date` Header
1919
pub const DATE: HeaderName = HeaderName::from_lowercase_str("date");
20+
21+
/// The `Origin` Header
22+
pub const ORIGIN: HeaderName = HeaderName::from_lowercase_str("origin");
23+
24+
/// The `access-control-max-age` Header
25+
pub const ACCESS_CONTROL_MAX_AGE: HeaderName =
26+
HeaderName::from_lowercase_str("access-control-max-age");
27+
/// The `access-control-allow-origin` Header
28+
pub const ACCESS_CONTROL_ALLOW_ORIGIN: HeaderName =
29+
HeaderName::from_lowercase_str("access-control-allow-origin");
30+
/// The `access-control-allow-headers` Header
31+
pub const ACCESS_CONTROL_ALLOW_HEADERS: HeaderName =
32+
HeaderName::from_lowercase_str("access-control-allow-headers");
33+
/// The `access-control-allow-methods` Header
34+
pub const ACCESS_CONTROL_ALLOW_METHODS: HeaderName =
35+
HeaderName::from_lowercase_str("access-control-allow-methods");
36+
/// The `access-control-expose-headers` Header
37+
pub const ACCESS_CONTROL_EXPOSE_HEADERS: HeaderName =
38+
HeaderName::from_lowercase_str("access-control-expose-headers");
39+
/// The `access-control-request-method` Header
40+
pub const ACCESS_CONTROL_REQUEST_METHOD: HeaderName =
41+
HeaderName::from_lowercase_str("access-control-request-method");
42+
/// The `access-control-request-headers` Header
43+
pub const ACCESS_CONTROL_REQUEST_HEADERS: HeaderName =
44+
HeaderName::from_lowercase_str("access-control-request-headers");
45+
/// The `access-control-allow-credentials` Header
46+
pub const ACCESS_CONTROL_ALLOW_CREDENTIALS: HeaderName =
47+
HeaderName::from_lowercase_str("access-control-allow-credentials");

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,9 @@ pub mod trailers;
152152
#[cfg(feature = "hyperium_http")]
153153
mod hyperium_http;
154154

155+
/// Map of arbitrary types to extend the protocol.
156+
pub type Extensions = type_map::concurrent::TypeMap;
157+
155158
// Not public API. Referenced by macro-generated code.
156159
#[doc(hidden)]
157160
pub mod private {

src/request.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::headers::{
1212
use crate::mime::Mime;
1313
use crate::trailers::{Trailers, TrailersSender};
1414
use crate::Cookie;
15-
use crate::{Body, Method, Url, Version};
15+
use crate::{Body, Extensions, Method, Url, Version};
1616

1717
pin_project_lite::pin_project! {
1818
/// An HTTP request.
@@ -35,6 +35,7 @@ pin_project_lite::pin_project! {
3535
receiver: sync::Receiver<crate::Result<Trailers>>,
3636
#[pin]
3737
body: Body,
38+
extensions: Extensions,
3839
}
3940
}
4041

@@ -50,6 +51,7 @@ impl Request {
5051
body: Body::empty(),
5152
sender: Some(sender),
5253
receiver,
54+
extensions: Extensions::new(),
5355
}
5456
}
5557

@@ -423,6 +425,31 @@ impl Request {
423425
pub fn header_values<'a>(&'a self) -> Values<'a> {
424426
self.headers.values()
425427
}
428+
429+
/// Returns a reference to the existing extensions.
430+
pub fn extensions(&self) -> &Extensions {
431+
&self.extensions
432+
}
433+
434+
/// Returns a mutuable reference to the existing extensions.
435+
///
436+
///
437+
/// # Examples
438+
///
439+
/// ```
440+
/// # fn main() -> Result<(), http_types::Error> {
441+
/// #
442+
/// use http_types::{Url, Method, Request, Version};
443+
///
444+
/// let mut req = Request::new(Method::Get, Url::parse("https://example.com")?);
445+
/// req.extensions_mut().insert("hello from the extension");
446+
/// assert_eq!(req.extensions().get(), Some(&"hello from the extension"));
447+
/// #
448+
/// # Ok(()) }
449+
/// ```
450+
pub fn extensions_mut(&mut self) -> &mut Extensions {
451+
&mut self.extensions
452+
}
426453
}
427454

428455
impl Read for Request {

src/response.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::headers::{
1111
};
1212
use crate::mime::Mime;
1313
use crate::trailers::{Trailers, TrailersSender};
14-
use crate::{Body, Cookie, StatusCode, Version};
14+
use crate::{Body, Cookie, Extensions, StatusCode, Version};
1515

1616
pin_project_lite::pin_project! {
1717
/// An HTTP response.
@@ -37,6 +37,7 @@ pin_project_lite::pin_project! {
3737
receiver: sync::Receiver<crate::Result<Trailers>>,
3838
#[pin]
3939
body: Body,
40+
extensions: Extensions,
4041
}
4142
}
4243

@@ -51,6 +52,7 @@ impl Response {
5152
body: Body::empty(),
5253
sender: Some(sender),
5354
receiver,
55+
extensions: Extensions::new(),
5456
}
5557
}
5658

@@ -389,6 +391,31 @@ impl Response {
389391
pub fn header_values<'a>(&'a self) -> Values<'a> {
390392
self.headers.values()
391393
}
394+
395+
/// Returns a reference to the existing extensions.
396+
pub fn extensions(&self) -> &Extensions {
397+
&self.extensions
398+
}
399+
400+
/// Returns a mutuable reference to the existing extensions.
401+
///
402+
///
403+
/// # Examples
404+
///
405+
/// ```
406+
/// # fn main() -> Result<(), http_types::Error> {
407+
/// #
408+
/// use http_types::{StatusCode, Response, Version};
409+
///
410+
/// let mut res = Response::new(StatusCode::Ok);
411+
/// res.extensions_mut().insert("hello from the extension");
412+
/// assert_eq!(res.extensions().get(), Some(&"hello from the extension"));
413+
/// #
414+
/// # Ok(()) }
415+
/// ```
416+
pub fn extensions_mut(&mut self) -> &mut Extensions {
417+
&mut self.extensions
418+
}
392419
}
393420

394421
impl Read for Response {

0 commit comments

Comments
 (0)