mirror of
https://github.com/actix/actix-web.git
synced 2024-11-27 03:51:10 +00:00
use Params object for query
This commit is contained in:
parent
19e1c1b75b
commit
6bb893deab
3 changed files with 24 additions and 13 deletions
|
@ -146,9 +146,9 @@ and:
|
||||||
/{foo}/bar/baz
|
/{foo}/bar/baz
|
||||||
```
|
```
|
||||||
|
|
||||||
A *variable part*(replacement marker) is specified in the form *{identifier}*,
|
A *variable part* (replacement marker) is specified in the form *{identifier}*,
|
||||||
where this means "accept any characters up to the next slash character and use this
|
where this means "accept any characters up to the next slash character and use this
|
||||||
as the name in the `HttpRequest.match_info` object".
|
as the name in the `HttpRequest.match_info()` object".
|
||||||
|
|
||||||
A replacement marker in a pattern matches the regular expression `[^{}/]+`.
|
A replacement marker in a pattern matches the regular expression `[^{}/]+`.
|
||||||
|
|
||||||
|
|
|
@ -262,14 +262,14 @@ At the same time *Payload* implements *Stream* trait, so it could be used with v
|
||||||
stream combinators. Also *Payload* provides serveral convinience methods that return
|
stream combinators. Also *Payload* provides serveral convinience methods that return
|
||||||
future object that resolve to Bytes object.
|
future object that resolve to Bytes object.
|
||||||
|
|
||||||
* *readany* method returns *Stream* of *Bytes* objects.
|
* *readany()* method returns *Stream* of *Bytes* objects.
|
||||||
|
|
||||||
* *readexactly* method returns *Future* that resolves when specified number of bytes
|
* *readexactly()* method returns *Future* that resolves when specified number of bytes
|
||||||
get received.
|
get received.
|
||||||
|
|
||||||
* *readline* method returns *Future* that resolves when `\n` get received.
|
* *readline()* method returns *Future* that resolves when `\n` get received.
|
||||||
|
|
||||||
* *readuntil* method returns *Future* that resolves when specified bytes string
|
* *readuntil()* method returns *Future* that resolves when specified bytes string
|
||||||
matches in input bytes stream
|
matches in input bytes stream
|
||||||
|
|
||||||
In this example handle reads request payload chunk by chunk and prints every chunk.
|
In this example handle reads request payload chunk by chunk and prints every chunk.
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
//! HTTP Request message related code.
|
//! HTTP Request message related code.
|
||||||
use std::{str, fmt, mem};
|
use std::{str, fmt, mem};
|
||||||
use std::borrow::Cow;
|
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
@ -30,6 +29,8 @@ pub struct HttpMessage {
|
||||||
pub extensions: Extensions,
|
pub extensions: Extensions,
|
||||||
pub params: Params<'static>,
|
pub params: Params<'static>,
|
||||||
pub cookies: Option<Vec<Cookie<'static>>>,
|
pub cookies: Option<Vec<Cookie<'static>>>,
|
||||||
|
pub query: Params<'static>,
|
||||||
|
pub query_loaded: bool,
|
||||||
pub addr: Option<SocketAddr>,
|
pub addr: Option<SocketAddr>,
|
||||||
pub payload: Option<Payload>,
|
pub payload: Option<Payload>,
|
||||||
pub info: Option<ConnectionInfo<'static>>,
|
pub info: Option<ConnectionInfo<'static>>,
|
||||||
|
@ -44,6 +45,8 @@ impl Default for HttpMessage {
|
||||||
version: Version::HTTP_11,
|
version: Version::HTTP_11,
|
||||||
headers: HeaderMap::with_capacity(16),
|
headers: HeaderMap::with_capacity(16),
|
||||||
params: Params::default(),
|
params: Params::default(),
|
||||||
|
query: Params::default(),
|
||||||
|
query_loaded: false,
|
||||||
cookies: None,
|
cookies: None,
|
||||||
addr: None,
|
addr: None,
|
||||||
payload: None,
|
payload: None,
|
||||||
|
@ -79,6 +82,8 @@ impl HttpMessage {
|
||||||
self.headers.clear();
|
self.headers.clear();
|
||||||
self.extensions.clear();
|
self.extensions.clear();
|
||||||
self.params.clear();
|
self.params.clear();
|
||||||
|
self.query.clear();
|
||||||
|
self.query_loaded = false;
|
||||||
self.cookies = None;
|
self.cookies = None;
|
||||||
self.addr = None;
|
self.addr = None;
|
||||||
self.info = None;
|
self.info = None;
|
||||||
|
@ -102,6 +107,8 @@ impl HttpRequest<()> {
|
||||||
version: version,
|
version: version,
|
||||||
headers: headers,
|
headers: headers,
|
||||||
params: Params::default(),
|
params: Params::default(),
|
||||||
|
query: Params::default(),
|
||||||
|
query_loaded: false,
|
||||||
cookies: None,
|
cookies: None,
|
||||||
addr: None,
|
addr: None,
|
||||||
payload: payload,
|
payload: payload,
|
||||||
|
@ -272,13 +279,17 @@ impl<S> HttpRequest<S> {
|
||||||
self.as_mut().addr = addr
|
self.as_mut().addr = addr
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return a new iterator that yields pairs of `Cow<str>` for query parameters
|
/// Get a reference to the Params object.
|
||||||
pub fn query(&self) -> HashMap<Cow<str>, Cow<str>> {
|
/// Params is a container for url query parameters.
|
||||||
let mut q = HashMap::new();
|
pub fn query(&self) -> &Params {
|
||||||
|
if !self.as_ref().query_loaded {
|
||||||
|
let params: &mut Params = unsafe{ mem::transmute(&mut self.as_mut().query) };
|
||||||
|
self.as_mut().query_loaded = true;
|
||||||
for (key, val) in form_urlencoded::parse(self.query_string().as_ref()) {
|
for (key, val) in form_urlencoded::parse(self.query_string().as_ref()) {
|
||||||
q.insert(key, val);
|
params.add(key, val);
|
||||||
}
|
}
|
||||||
q
|
}
|
||||||
|
unsafe{ mem::transmute(&self.as_ref().query) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The query string in the URL.
|
/// The query string in the URL.
|
||||||
|
|
Loading…
Reference in a new issue