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.
#[cfg(feature = "cookies")]
#[inline]
fn cookies(&self) -> Result<Ref<'_, Vec<Cookie<'static>>>, CookieParseError> {
eprintln!("default impl cookies?");
if self.extensions().get::<Cookies>().is_none() {
let mut cookies = Vec::new();
for hdr in self.headers().get_all(header::COOKIE) {
@ -122,6 +123,7 @@ pub trait HttpMessage: Sized {
}
self.extensions_mut().insert(Cookies(cookies));
}
Ok(Ref::map(self.extensions(), |ext| {
&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::future::Future;
use std::marker::PhantomData;
@ -11,11 +11,12 @@ use futures_core::{ready, Stream};
use actix_http::error::PayloadError;
use actix_http::http::header;
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 serde::de::DeserializeOwned;
#[cfg(feature = "cookies")]
use actix_http::{cookie::Cookie, error::CookieParseError};
use crate::error::JsonPayloadError;
/// Client Response
@ -40,16 +41,18 @@ impl<S> HttpMessage for ClientResponse<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.
#[cfg(feature = "cookies")]
#[inline]
fn cookies(&self) -> Result<Ref<'_, Vec<Cookie<'static>>>, CookieParseError> {
eprintln!("awc fn cookies");
struct Cookies(Vec<Cookie<'static>>);
if self.extensions().get::<Cookies>().is_none() {
eprintln!("no cookies, inserting");
let mut cookies = Vec::new();
for hdr in self.headers().get_all(&header::SET_COOKIE) {
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")
.http_only(true)
.finish();
let second_cookie = http::Cookie::new("second", "second_value");
let req = srv.get("/");
let res = req.send().await.unwrap();
assert!(res.status().is_success());
eprintln!("gimme cookie");
let cookies = res.cookies().expect("To have cookies");
assert_eq!(cookies.len(), 2);
if cookies[0] == first_cookie {