1
0
mirror of https://github.com/actix/actix-extras.git synced 2024-11-23 23:51:06 +01:00

added HttpRequest::query

This commit is contained in:
Nikolay Kim 2017-10-16 09:43:10 -07:00
parent ba1a73443e
commit 88a81155bd
3 changed files with 63 additions and 36 deletions

View File

@ -1,5 +1,6 @@
//! Pieces pertaining to the HTTP message protocol. //! Pieces pertaining to the HTTP message protocol.
use std::{io, str}; use std::{io, str};
use url::form_urlencoded;
use http::{header, Method, Version, Uri, HeaderMap}; use http::{header, Method, Version, Uri, HeaderMap};
use Params; use Params;
@ -65,10 +66,18 @@ impl HttpRequest {
self.uri.path() self.uri.path()
} }
/// The query string of this Request. /// Return a new iterator that yields pairs of `Cow<str>` for query parameters
#[inline] #[inline]
pub fn query(&self) -> Option<&str> { pub fn query(&self) -> form_urlencoded::Parse {
self.uri.query() form_urlencoded::parse(self.query_string().as_ref())
}
/// The query string in the URL.
///
/// E.g., id=10
#[inline]
pub fn query_string(&self) -> &str {
self.uri.query().unwrap_or("")
} }
/// Return request cookies. /// Return request cookies.

View File

@ -3,7 +3,6 @@ extern crate http;
extern crate time; extern crate time;
use actix_web::*; use actix_web::*;
use time::Duration;
use http::{header, Method, Uri, Version, HeaderMap, HttpTryFrom}; use http::{header, Method, Uri, Version, HeaderMap, HttpTryFrom};
@ -44,38 +43,6 @@ fn test_request_cookies() {
assert!(cookie.is_none()); assert!(cookie.is_none());
} }
#[test]
fn test_response_cookies() {
let mut headers = HeaderMap::new();
headers.insert(header::COOKIE,
header::HeaderValue::from_static("cookie1=value1; cookie2=value2"));
let mut req = HttpRequest::new(
Method::GET, Uri::try_from("/").unwrap(), Version::HTTP_11, headers);
let cookies = req.load_cookies().unwrap();
let resp = httpcodes::HTTPOk
.builder()
.cookie(Cookie::build("name", "value")
.domain("www.rust-lang.org")
.path("/test")
.http_only(true)
.max_age(Duration::days(1))
.finish())
.del_cookie(&cookies[0])
.body(Body::Empty);
assert!(resp.is_ok());
let resp = resp.unwrap();
let mut val: Vec<_> = resp.headers().get_all("Set-Cookie")
.iter().map(|v| v.to_str().unwrap().to_owned()).collect();
val.sort();
assert!(val[0].starts_with("cookie1=; Max-Age=0;"));
assert_eq!(
val[1],"name=value; HttpOnly; Path=/test; Domain=www.rust-lang.org; Max-Age=86400");
}
#[test] #[test]
fn test_no_request_range_header() { fn test_no_request_range_header() {
let req = HttpRequest::new(Method::GET, Uri::try_from("/").unwrap(), let req = HttpRequest::new(Method::GET, Uri::try_from("/").unwrap(),
@ -97,3 +64,14 @@ fn test_request_range_header() {
assert_eq!(ranges[0].start, 0); assert_eq!(ranges[0].start, 0);
assert_eq!(ranges[0].length, 5); assert_eq!(ranges[0].length, 5);
} }
#[test]
fn test_request_query() {
let req = HttpRequest::new(Method::GET, Uri::try_from("/?id=test").unwrap(),
Version::HTTP_11, HeaderMap::new());
assert_eq!(req.query_string(), "id=test");
let query: Vec<_> = req.query().collect();
assert_eq!(query[0].0.as_ref(), "id");
assert_eq!(query[0].1.as_ref(), "test");
}

View File

@ -0,0 +1,40 @@
extern crate actix_web;
extern crate http;
extern crate time;
use actix_web::*;
use time::Duration;
use http::{header, Method, Uri, Version, HeaderMap, HttpTryFrom};
#[test]
fn test_response_cookies() {
let mut headers = HeaderMap::new();
headers.insert(header::COOKIE,
header::HeaderValue::from_static("cookie1=value1; cookie2=value2"));
let mut req = HttpRequest::new(
Method::GET, Uri::try_from("/").unwrap(), Version::HTTP_11, headers);
let cookies = req.load_cookies().unwrap();
let resp = httpcodes::HTTPOk
.builder()
.cookie(Cookie::build("name", "value")
.domain("www.rust-lang.org")
.path("/test")
.http_only(true)
.max_age(Duration::days(1))
.finish())
.del_cookie(&cookies[0])
.body(Body::Empty);
assert!(resp.is_ok());
let resp = resp.unwrap();
let mut val: Vec<_> = resp.headers().get_all("Set-Cookie")
.iter().map(|v| v.to_str().unwrap().to_owned()).collect();
val.sort();
assert!(val[0].starts_with("cookie1=; Max-Age=0;"));
assert_eq!(
val[1],"name=value; HttpOnly; Path=/test; Domain=www.rust-lang.org; Max-Age=86400");
}