|
3 | 3 | use std::collections::HashMap;
|
4 | 4 | use std::convert::TryInto;
|
5 | 5 | use std::iter::IntoIterator;
|
| 6 | +use std::ops::Index; |
| 7 | +use std::str::FromStr; |
6 | 8 |
|
7 | 9 | use crate::headers::{
|
8 | 10 | HeaderName, HeaderValues, IntoIter, Iter, IterMut, Names, ToHeaderValues, Values,
|
9 | 11 | };
|
10 | 12 |
|
11 | 13 | /// A collection of HTTP Headers.
|
| 14 | +/// |
| 15 | +/// Headers are never manually constructed, but are part of `Request`, |
| 16 | +/// `Response`, and `Trailers`. Each of these types implements `AsRef<Headers>` |
| 17 | +/// and `AsMut<Headers>` so functions that want to modify headers can be generic |
| 18 | +/// over either of these traits. |
| 19 | +/// |
| 20 | +/// # Examples |
| 21 | +/// |
| 22 | +/// ``` |
| 23 | +/// use http_types::{Response, StatusCode}; |
| 24 | +/// |
| 25 | +/// let mut res = Response::new(StatusCode::Ok); |
| 26 | +/// res.insert_header("hello", "foo0").unwrap(); |
| 27 | +/// assert_eq!(res["hello"], "foo0"); |
| 28 | +/// ``` |
12 | 29 | #[derive(Debug, Clone)]
|
13 | 30 | pub struct Headers {
|
14 | 31 | pub(crate) headers: HashMap<HeaderName, HeaderValues>,
|
@@ -106,6 +123,35 @@ impl Headers {
|
106 | 123 | }
|
107 | 124 | }
|
108 | 125 |
|
| 126 | +impl Index<&HeaderName> for Headers { |
| 127 | + type Output = HeaderValues; |
| 128 | + |
| 129 | + /// Returns a reference to the value corresponding to the supplied name. |
| 130 | + /// |
| 131 | + /// # Panics |
| 132 | + /// |
| 133 | + /// Panics if the name is not present in `Headers`. |
| 134 | + #[inline] |
| 135 | + fn index(&self, name: &HeaderName) -> &HeaderValues { |
| 136 | + self.get(name).expect("no entry found for name") |
| 137 | + } |
| 138 | +} |
| 139 | + |
| 140 | +impl Index<&str> for Headers { |
| 141 | + type Output = HeaderValues; |
| 142 | + |
| 143 | + /// Returns a reference to the value corresponding to the supplied name. |
| 144 | + /// |
| 145 | + /// # Panics |
| 146 | + /// |
| 147 | + /// Panics if the name is not present in `Headers`. |
| 148 | + #[inline] |
| 149 | + fn index(&self, name: &str) -> &HeaderValues { |
| 150 | + let name = HeaderName::from_str(name).expect("string slice needs to be valid ASCII"); |
| 151 | + self.get(&name).expect("no entry found for name") |
| 152 | + } |
| 153 | +} |
| 154 | + |
109 | 155 | impl IntoIterator for Headers {
|
110 | 156 | type Item = (HeaderName, HeaderValues);
|
111 | 157 | type IntoIter = IntoIter;
|
@@ -173,4 +219,11 @@ mod tests {
|
173 | 219 |
|
174 | 220 | Ok(())
|
175 | 221 | }
|
| 222 | + |
| 223 | + #[test] |
| 224 | + fn index_into_headers() { |
| 225 | + let mut headers = Headers::new(); |
| 226 | + headers.insert("hello", "foo0").unwrap(); |
| 227 | + assert_eq!(headers["hello"], "foo0"); |
| 228 | + } |
176 | 229 | }
|
0 commit comments