1
0
Fork 0
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:
Nikolay Kim 2017-12-27 19:02:29 -08:00
parent 19e1c1b75b
commit 6bb893deab
3 changed files with 24 additions and 13 deletions

View file

@ -146,9 +146,9 @@ and:
/{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
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 `[^{}/]+`.

View file

@ -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
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.
* *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
In this example handle reads request payload chunk by chunk and prints every chunk.

View file

@ -1,6 +1,5 @@
//! HTTP Request message related code.
use std::{str, fmt, mem};
use std::borrow::Cow;
use std::rc::Rc;
use std::net::SocketAddr;
use std::collections::HashMap;
@ -30,6 +29,8 @@ pub struct HttpMessage {
pub extensions: Extensions,
pub params: Params<'static>,
pub cookies: Option<Vec<Cookie<'static>>>,
pub query: Params<'static>,
pub query_loaded: bool,
pub addr: Option<SocketAddr>,
pub payload: Option<Payload>,
pub info: Option<ConnectionInfo<'static>>,
@ -44,6 +45,8 @@ impl Default for HttpMessage {
version: Version::HTTP_11,
headers: HeaderMap::with_capacity(16),
params: Params::default(),
query: Params::default(),
query_loaded: false,
cookies: None,
addr: None,
payload: None,
@ -79,6 +82,8 @@ impl HttpMessage {
self.headers.clear();
self.extensions.clear();
self.params.clear();
self.query.clear();
self.query_loaded = false;
self.cookies = None;
self.addr = None;
self.info = None;
@ -102,6 +107,8 @@ impl HttpRequest<()> {
version: version,
headers: headers,
params: Params::default(),
query: Params::default(),
query_loaded: false,
cookies: None,
addr: None,
payload: payload,
@ -272,13 +279,17 @@ impl<S> HttpRequest<S> {
self.as_mut().addr = addr
}
/// Return a new iterator that yields pairs of `Cow<str>` for query parameters
pub fn query(&self) -> HashMap<Cow<str>, Cow<str>> {
let mut q = HashMap::new();
for (key, val) in form_urlencoded::parse(self.query_string().as_ref()) {
q.insert(key, val);
/// Get a reference to the Params object.
/// Params is a container for url query parameters.
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()) {
params.add(key, val);
}
}
q
unsafe{ mem::transmute(&self.as_ref().query) }
}
/// The query string in the URL.