This commit is contained in:
Rob Ede 2021-02-12 03:58:21 +00:00
parent 156462fdc1
commit 0dbd16511b
No known key found for this signature in database
GPG Key ID: C2A3B36E841A91E6
3 changed files with 18 additions and 10 deletions

View File

@ -107,8 +107,9 @@ pub trait HttpMessage: Sized {
/// Load request cookies. /// Load request cookies.
#[cfg(feature = "cookies")] #[cfg(feature = "cookies")]
#[inline]
fn cookies(&self) -> Result<Ref<'_, Vec<Cookie<'static>>>, CookieParseError> { fn cookies(&self) -> Result<Ref<'_, Vec<Cookie<'static>>>, CookieParseError> {
eprintln!("default impl cookies?");
if self.extensions().get::<Cookies>().is_none() { if self.extensions().get::<Cookies>().is_none() {
let mut cookies = Vec::new(); let mut cookies = Vec::new();
for hdr in self.headers().get_all(header::COOKIE) { for hdr in self.headers().get_all(header::COOKIE) {
@ -122,6 +123,7 @@ pub trait HttpMessage: Sized {
} }
self.extensions_mut().insert(Cookies(cookies)); self.extensions_mut().insert(Cookies(cookies));
} }
Ok(Ref::map(self.extensions(), |ext| { Ok(Ref::map(self.extensions(), |ext| {
&ext.get::<Cookies>().unwrap().0 &ext.get::<Cookies>().unwrap().0
})) }))

View File

@ -1,4 +1,4 @@
use std::cell::{Ref, RefMut}; use std::{cell::{Ref, RefMut}, mem};
use std::fmt; use std::fmt;
use std::future::Future; use std::future::Future;
use std::marker::PhantomData; use std::marker::PhantomData;
@ -11,11 +11,12 @@ use futures_core::{ready, Stream};
use actix_http::error::PayloadError; use actix_http::error::PayloadError;
use actix_http::http::header; use actix_http::http::header;
use actix_http::http::{HeaderMap, StatusCode, Version}; use actix_http::http::{HeaderMap, StatusCode, Version};
#[cfg(feature = "cookies")]
use actix_http::{cookie::Cookie, error::CookieParseError};
use actix_http::{Extensions, HttpMessage, Payload, PayloadStream, ResponseHead}; use actix_http::{Extensions, HttpMessage, Payload, PayloadStream, ResponseHead};
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
#[cfg(feature = "cookies")]
use actix_http::{cookie::Cookie, error::CookieParseError};
use crate::error::JsonPayloadError; use crate::error::JsonPayloadError;
/// Client Response /// Client Response
@ -40,16 +41,18 @@ impl<S> HttpMessage for ClientResponse<S> {
} }
fn take_payload(&mut self) -> Payload<S> { fn take_payload(&mut self) -> Payload<S> {
std::mem::replace(&mut self.payload, Payload::None) mem::replace(&mut self.payload, Payload::None)
} }
/// Load request cookies. /// Load request cookies.
#[cfg(feature = "cookies")] #[cfg(feature = "cookies")]
#[inline]
fn cookies(&self) -> Result<Ref<'_, Vec<Cookie<'static>>>, CookieParseError> { fn cookies(&self) -> Result<Ref<'_, Vec<Cookie<'static>>>, CookieParseError> {
eprintln!("awc fn cookies");
struct Cookies(Vec<Cookie<'static>>); struct Cookies(Vec<Cookie<'static>>);
if self.extensions().get::<Cookies>().is_none() { if self.extensions().get::<Cookies>().is_none() {
eprintln!("no cookies, inserting");
let mut cookies = Vec::new(); let mut cookies = Vec::new();
for hdr in self.headers().get_all(&header::SET_COOKIE) { for hdr in self.headers().get_all(&header::SET_COOKIE) {
let s = std::str::from_utf8(hdr.as_bytes()).map_err(CookieParseError::from)?; let s = std::str::from_utf8(hdr.as_bytes()).map_err(CookieParseError::from)?;

View File

@ -806,15 +806,18 @@ async fn test_server_cookies() {
})) }))
}); });
let req = srv.get("/");
let res = req.send().await.unwrap();
assert!(res.status().is_success());
eprintln!("{:?}", &res);
let first_cookie = http::CookieBuilder::new("first", "first_value") let first_cookie = http::CookieBuilder::new("first", "first_value")
.http_only(true) .http_only(true)
.finish(); .finish();
let second_cookie = http::Cookie::new("second", "second_value"); let second_cookie = http::Cookie::new("second", "second_value");
let req = srv.get("/"); eprintln!("gimme cookie");
let res = req.send().await.unwrap();
assert!(res.status().is_success());
let cookies = res.cookies().expect("To have cookies"); let cookies = res.cookies().expect("To have cookies");
assert_eq!(cookies.len(), 2); assert_eq!(cookies.len(), 2);
if cookies[0] == first_cookie { if cookies[0] == first_cookie {