7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RustAdvent Calendar 2015

Day 21

hyperでcookieを覚えたリダイレクトに対応させる

Posted at

この記事は、Rustアドベントカレンダー21日目の記事です。

はじめに

この記事は、

  • Rust 1.5
  • hyper 0.6.15
  • cookie 0.1
  • url

の環境においての説明を行っています。

hyper

hyper は github上で星を1300集めているHTTP通信を行うためのライブラリです。今回はこのライブラリの話をしようと思います。

hyperでリダイレクト時にCookieが含まれない

hyperを使い、外部に対して通信を行う処理を書いていたのですが、リダイレクトを行う必要がある時にうまくcookieを覚えてくれないことに気づきました。hyper自体にcookieを扱う機能は用意されているのですが、一回のリクエストに対してどんなCookieを与えるか ということであり Set-Cookie には対応していないようです。

また勉強不足なのかもしれませんが、現時点において、GithubでSetCookieで検索しても、あまりHITしません。

Set-Cookie を処理する

hyperでCookieを保持するには、サーバーから送られてきたレスポンスヘッダに含まれるSet-Cookieを処理する必要があります。今回はこれを、hyper自体を書き換えず、hyperのラッパーCrateを作成して対応することにしました。

なので正確にはhyperに対応させるのではなく、hyperの管理しているheaderをラッパーCrateが管理し、その際にSet-Cookieを処理するということになります。

let res = self.client
              .post(url)
              .body(&request_body.to_owned())
              .headers(self.headers.clone())
              .send();

上記はhyperの例です。resにはOption<[Response](http://hyper.rs/hyper/hyper/client/response/struct.Response.html)>が返っています。

Responseは、フィールドに、headers を持っています。このheadersに含まれる、Set-Cookieを抽出し、ラッパーCrateのheadersに上書きすることを繰り返すことで、cookieを覚えさせる事ができます。

リダイレクトさせる

標準のhyperはデフォルトでリダイレクトに対応していますが、Cookieを覚えてくれないのでhyperのリダイレクト機能をオフにします。

self.client.set_redirect_policy(RedirectPolicy::FollowNone);

リダイレクトポリシーをFollowNoneにすることで、自動的にリダイレクトしなくなります。

後は、Responseのフィールドのstatusを見て、再帰処理によってリダイレクトを行うと良いです。

if res.unwrap().status == StatusCode::MovedPermanently || v.status == StatusCode::Found {
}

サンプルコード

ここまでの処理を サンプルコード にして公開しました。セキュリティリスクをほとんど考えてないので、使用は自己責任でお願いします。また、ライセンスはパブリックドメインです。ご自由にお使いください。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?