Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

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

環境

  • 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()}")

参考

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
2
Help us understand the problem. What are the problem?