This commit is contained in:
Konrad Borowski 2018-06-19 06:39:20 +00:00 committed by GitHub
commit b115fe54d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 52 deletions

View File

@ -131,7 +131,7 @@ impl ClientRequest {
ClientRequestBuilder { ClientRequestBuilder {
request: Some(ClientRequest::default()), request: Some(ClientRequest::default()),
err: None, err: None,
cookies: None, cookies: CookieJar::new(),
default_headers: true, default_headers: true,
} }
} }
@ -274,7 +274,7 @@ impl fmt::Debug for ClientRequest {
pub struct ClientRequestBuilder { pub struct ClientRequestBuilder {
request: Option<ClientRequest>, request: Option<ClientRequest>,
err: Option<HttpError>, err: Option<HttpError>,
cookies: Option<CookieJar>, cookies: CookieJar,
default_headers: bool, default_headers: bool,
} }
@ -496,13 +496,7 @@ impl ClientRequestBuilder {
/// } /// }
/// ``` /// ```
pub fn cookie<'c>(&mut self, cookie: Cookie<'c>) -> &mut Self { pub fn cookie<'c>(&mut self, cookie: Cookie<'c>) -> &mut Self {
if self.cookies.is_none() { self.cookies.add(cookie.into_owned());
let mut jar = CookieJar::new();
jar.add(cookie.into_owned());
self.cookies = Some(jar)
} else {
self.cookies.as_mut().unwrap().add(cookie.into_owned());
}
self self
} }
@ -624,13 +618,13 @@ impl ClientRequestBuilder {
let mut request = self.request.take().expect("cannot reuse request builder"); let mut request = self.request.take().expect("cannot reuse request builder");
// set cookies // set cookies
if let Some(ref mut jar) = self.cookies { let mut cookie = String::new();
let mut cookie = String::new(); for c in self.cookies.delta() {
for c in jar.delta() { let name = percent_encode(c.name().as_bytes(), USERINFO_ENCODE_SET);
let name = percent_encode(c.name().as_bytes(), USERINFO_ENCODE_SET); let value = percent_encode(c.value().as_bytes(), USERINFO_ENCODE_SET);
let value = percent_encode(c.value().as_bytes(), USERINFO_ENCODE_SET); let _ = write!(&mut cookie, "; {}={}", name, value);
let _ = write!(&mut cookie, "; {}={}", name, value); }
} if !cookie.is_empty() {
request.headers.insert( request.headers.insert(
header::COOKIE, header::COOKIE,
HeaderValue::from_str(&cookie.as_str()[2..]).unwrap(), HeaderValue::from_str(&cookie.as_str()[2..]).unwrap(),
@ -699,7 +693,7 @@ impl ClientRequestBuilder {
ClientRequestBuilder { ClientRequestBuilder {
request: self.request.take(), request: self.request.take(),
err: self.err.take(), err: self.err.take(),
cookies: self.cookies.take(), cookies: mem::replace(&mut self.cookies, CookieJar::new()),
default_headers: self.default_headers, default_headers: self.default_headers,
} }
} }

View File

@ -98,15 +98,9 @@ impl HttpResponse {
#[inline] #[inline]
pub fn into_builder(mut self) -> HttpResponseBuilder { pub fn into_builder(mut self) -> HttpResponseBuilder {
// If this response has cookies, load them into a jar // If this response has cookies, load them into a jar
let mut jar: Option<CookieJar> = None; let mut jar = CookieJar::new();
for c in self.cookies() { for c in self.cookies() {
if let Some(ref mut j) = jar { jar.add_original(c.into_owned());
j.add_original(c.into_owned());
} else {
let mut j = CookieJar::new();
j.add_original(c.into_owned());
jar = Some(j);
}
} }
let response = self.0.take(); let response = self.0.take();
@ -352,7 +346,7 @@ pub struct HttpResponseBuilder {
response: Option<Box<InnerHttpResponse>>, response: Option<Box<InnerHttpResponse>>,
pool: Option<Rc<UnsafeCell<HttpResponsePool>>>, pool: Option<Rc<UnsafeCell<HttpResponsePool>>>,
err: Option<HttpError>, err: Option<HttpError>,
cookies: Option<CookieJar>, cookies: CookieJar,
} }
impl HttpResponseBuilder { impl HttpResponseBuilder {
@ -546,13 +540,7 @@ impl HttpResponseBuilder {
/// } /// }
/// ``` /// ```
pub fn cookie<'c>(&mut self, cookie: Cookie<'c>) -> &mut Self { pub fn cookie<'c>(&mut self, cookie: Cookie<'c>) -> &mut Self {
if self.cookies.is_none() { self.cookies.add(cookie.into_owned());
let mut jar = CookieJar::new();
jar.add(cookie.into_owned());
self.cookies = Some(jar)
} else {
self.cookies.as_mut().unwrap().add(cookie.into_owned());
}
self self
} }
@ -573,15 +561,9 @@ impl HttpResponseBuilder {
/// } /// }
/// ``` /// ```
pub fn del_cookie<'a>(&mut self, cookie: &Cookie<'a>) -> &mut Self { pub fn del_cookie<'a>(&mut self, cookie: &Cookie<'a>) -> &mut Self {
{ let cookie = cookie.clone().into_owned();
if self.cookies.is_none() { self.cookies.add_original(cookie.clone());
self.cookies = Some(CookieJar::new()) self.cookies.remove(cookie);
}
let jar = self.cookies.as_mut().unwrap();
let cookie = cookie.clone().into_owned();
jar.add_original(cookie.clone());
jar.remove(cookie);
}
self self
} }
@ -631,13 +613,11 @@ impl HttpResponseBuilder {
return Error::from(e).into(); return Error::from(e).into();
} }
let mut response = self.response.take().expect("cannot reuse response builder"); let mut response = self.response.take().expect("cannot reuse response builder");
if let Some(ref jar) = self.cookies { for cookie in self.cookies.delta() {
for cookie in jar.delta() { match HeaderValue::from_str(&cookie.to_string()) {
match HeaderValue::from_str(&cookie.to_string()) { Ok(val) => response.headers.append(header::SET_COOKIE, val),
Ok(val) => response.headers.append(header::SET_COOKIE, val), Err(e) => return Error::from(e).into(),
Err(e) => return Error::from(e).into(), };
};
}
} }
response.body = body.into(); response.body = body.into();
HttpResponse(Some(response), self.pool.take().unwrap()) HttpResponse(Some(response), self.pool.take().unwrap())
@ -691,7 +671,7 @@ impl HttpResponseBuilder {
response: self.response.take(), response: self.response.take(),
pool: self.pool.take(), pool: self.pool.take(),
err: self.err.take(), err: self.err.take(),
cookies: self.cookies.take(), cookies: mem::replace(&mut self.cookies, CookieJar::new()),
} }
} }
} }
@ -939,7 +919,7 @@ impl HttpResponsePool {
response: Some(msg), response: Some(msg),
pool: Some(Rc::clone(pool)), pool: Some(Rc::clone(pool)),
err: None, err: None,
cookies: None, cookies: CookieJar::new(),
} }
} else { } else {
let msg = Box::new(InnerHttpResponse::new(status, Body::Empty)); let msg = Box::new(InnerHttpResponse::new(status, Body::Empty));
@ -947,7 +927,7 @@ impl HttpResponsePool {
response: Some(msg), response: Some(msg),
pool: Some(Rc::clone(pool)), pool: Some(Rc::clone(pool)),
err: None, err: None,
cookies: None, cookies: CookieJar::new(),
} }
} }
} }