Help us understand the problem. What is going on with this article?

HTTPieのsessionはSet-Cookieヘッダにも反応してくれる

More than 3 years have passed since last update.

環境

  • HTTPie 0.9.3

地味に便利で重宝しているので書く。

HTTPieは--session={sessionName or path}を付けると、その時のCookieやヘッダ情報をファイルに保持してくれて次回以降のリクエストに利用してくれる。
マニュアルには載っていないのだが、レスポンスのSet-Cookieヘッダにも反応して、それをファイルに保持してくれる。

クライアントサイドセッション内に最終アクセス日時を保持していたりして、リクエストの度に返ってくるCookieが違う場合などは特に便利。

毎リクエスト変化するSet-Cookieを返すサーバが起動していて(サーバのコードは後述)、初めて--sessionのリクエストを実行してみる。

$ http -v --session=test localhost:8080
GET / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: localhost:8080
User-Agent: HTTPie/0.9.3



HTTP/1.1 200 OK
Date: Tue, 27 Dec 2016 09:27:10 GMT
Set-cookie: eiryu_cookie=1482831607601
Transfer-encoding: chunked

上記のようなリクエスト、レスポンスになった場合にHTTPieのセッション情報ファイルは、

$ cat ~/.httpie/sessions/localhost_8080/test.json
{
    "__meta__": {
        "about": "HTTPie session file",
        "help": "https://github.com/jkbrzt/httpie#sessions",
        "httpie": "0.9.3"
    },
    "auth": {
        "password": null,
        "type": null,
        "username": null
    },
    "cookies": {
        "eiryu_cookie": {
            "expires": null,
            "path": "/",
            "secure": false,
            "value": "1482831607601"
        }
    },
    "headers": {}
}

となっており、Set-Cookieの内容がファイルに保持されていることが分かる。
今のセッション情報ファイルをバックアップして、もう1度リクエストを送りdiffを取ってみる。

$ cp -p ~/.httpie/sessions/localhost_8080/test.json ~/.httpie/sessions/localhost_8080/test.json.bk
$ http -v --session=test localhost:8080
GET / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: eiryu_cookie=1482831607601
Host: localhost:8080
User-Agent: HTTPie/0.9.3



HTTP/1.1 200 OK
Date: Tue, 27 Dec 2016 09:40:38 GMT
Set-cookie: eiryu_cookie=1482831638983
Transfer-encoding: chunked

リクエストで先ほどのCookieがセットされていることと、レスポンスで別のSet-Cookieヘッダが返ってきていることが分かる。

$ diff -u ~/.httpie/sessions/localhost_8080/test.json.bk ~/.httpie/sessions/localhost_8080/test.json
--- /Users/eiryu/.httpie/sessions/localhost_8080/test.json.bk   2016-12-27 18:40:07.000000000 +0900
+++ /Users/eiryu/.httpie/sessions/localhost_8080/test.json  2016-12-27 18:40:38.000000000 +0900
@@ -14,7 +14,7 @@
             "expires": null,
             "path": "/",
             "secure": false,
-            "value": "1482831607601"
+            "value": "1482831638983"
         }
     },
     "headers": {}

見ての通り、Cookieの値が更新されていることが分かる。

Set-Cookieを返すサーバのコード(Groovy

import java.io.IOException
import java.net.InetSocketAddress

import com.sun.net.httpserver.HttpExchange
import com.sun.net.httpserver.HttpHandler
import com.sun.net.httpserver.HttpServer

class SimpleHttpHandler implements HttpHandler {
    @Override
    public void handle(HttpExchange exchange) throws IOException {
        try {
            def builder = new StringBuilder()

            def bytes = builder.toString().getBytes("UTF-8")
            exchange.getResponseHeaders().add('Set-Cookie' , 'eiryu_cookie=' + new Date().getTime())
            exchange.sendResponseHeaders(200, bytes.length)
            exchange.responseBody.withStream { it.write(bytes) }
        } catch (e) {
            e.printStackTrace()

            def message = "Server Error = ${e}"
            def bytes = message.getBytes("UTF-8")
            exchange.sendResponseHeaders(500, bytes.length)
            exchange.responseBody.withStream { it.write(bytes) }
        }
    }
}

server = HttpServer.create(new InetSocketAddress(8080), 0)
server.createContext("/", new SimpleHttpHandler())
server.start()

println("LightHttpd Startup. ${new Date()}")

参考

recruitmp
結婚・カーライフ・進学の情報サイトや『スタディサプリ』などの学びを支援するサービスなど、ライフイベント領域に関わるサービスを提供するリクルートグループの中核企業
http://www.recruit-mp.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした