2016-12-24 5 views
2

私はHTTPリクエストを送信するのにHyperを使用していますが、応答に複数のCookieが含まれている場合、Hyperはそれらを結合して解析手順に失敗します。出力は...Hyperでは、複数のSet-Cookieヘッダーを正しく処理する方法は?

let client = Client::new(); 
let response = client.get("http://local.example.com/test.php") 
    .send() 
    .unwrap(); 
println!("{:?}", response); 
for header in response.headers.iter() { 
    println!("{}: {}", header.name(), header.value_string()); 
} 

ます:以下の錆コードのためしかし

$ curl -sLD - http://local.example.com/test.php 
HTTP/1.1 200 OK 
Date: Sat, 24 Dec 2016 09:24:04 GMT 
Server: Apache/2.4.25 (Unix) PHP/7.0.14 
X-Powered-By: PHP/7.0.14 
Set-Cookie: hello=world 
Set-Cookie: foo=bar 
Content-Length: 0 
Content-Type: text/html; charset=UTF-8 

:たとえば、ここでは簡単なPHPスクリプトはカールを使用して

<?php 

setcookie("hello", "world"); 
setcookie("foo", "bar"); 

応答

をですbe:

Response { status: Ok, headers: Headers { Date: Sat, 24 Dec 2016 09:31:54 GMT, Server: Apache/2.4.25 (Unix) PHP/7.0.14, X-Powered-By: PHP/7.0.14, Set-Cookie: hello=worldfoo=bar, Content-Length: 0, Content-Type: text/html; charset=UTF-8, }, version: Http11, url: "http://local.example.com/test.php", status_raw: RawStatus(200, "OK"), message: Http11Message { is_proxied: false, method: None, stream: Wrapper { obj: Some(Reading(SizedReader(remaining=0))) } } } 
Date: Sat, 24 Dec 2016 09:31:54 GMT 
Server: Apache/2.4.25 (Unix) PHP/7.0.14 
X-Powered-By: PHP/7.0.14 
Set-Cookie: hello=worldfoo=bar 
Content-Length: 0 
Content-Type: text/html; charset=UTF-8 

これは私にとって本当に奇妙なようです。私は応答をキャプチャするためにWiresharkを使用しました。と2つのSet-Cookieヘッダーがあります。私はハイパードキュメントもチェックしましたが、手がかりはありませんでした。

Hyperは内部的にVecMap<HeaderName, Item>を使用してヘッダーを格納しています。それで彼らはそれらを一つに結びつけるのですか?その後、どのように個々のクッキーに分割する必要がありますか?

答えて

2

ハイパーは、CookieJar(参照:this implementation outline)の暗号署名をチェックするような、いくつかの余分なものを簡単にするために、クッキーを一緒に保つことを好むと思います。

もう1つの理由は、APIをシンプルにすることです。 Hyperのヘッダーは型によってインデックス付けされ、Headers::getでその型の単一のインスタンスしか取得できません。

ハイパーでは、通常、対応するタイプを使用してヘッダーにアクセスします。この場合、タイプはSetCookieです。たとえば:あなたは引用符とクッキーの属性(参照RFC 6265, 4.1)の適切な解析を再実装する必要がありますので、のSet-Cookieの生のヘッダの値へのアクセス

if let Some (&SetCookie (ref cookies)) = response.headers.get() { 
    for cookie in cookies.iter() { 
     println! ("Got a cookie. Name: {}. Value: {}.", cookie.name, cookie.value); 
    } 
} 

は、あまり意味があります。


P.S. Hyper 10では、クッキーはもはや解析されていないことに注意してください。because解析に使用されたクレートがopenssl依存関係を引き起こします。

+0

これは本当に役に立ちます。ありがとうございます。私は 'ハイパー'は、セミコロン分割と1つのヘッダーフィールドでクッキーを組み合わせることを好むかもしれないと思う...(http://hyper.rs/hyper/async/hyper/header/struct.Cookie.html) –

+0

ようこそ!ええ、ライブラリーのサーバー側でコードを再利用することは、クッキーを一緒に保つもう一つの良い理由のように聞こえます。 – ArtemGr

関連する問題