httpをプロトコルレベルで叩いてみたい。と思いました。(なぜ)
それをやってみて、「なるほど、ふむふむ。」とやっただけ話です。
なぜ、そんなことを?
djangoでhttp response headerの制御をしていたんですが、その時に制御結果が正しく反映されているかとか、どういうふうに出てるのか、とかを確認したいと思ったのが発端です。
ブラウザを使ってみればいいんですが。
あとは単純に、なんか楽しいかなと思ったので。
やってみる
とりあえず、別窓でdjangoをrunserverで起動してみます。(別にdjangoじゃなくてもいいけど)
$ python manage.py runserver
djangoのviewには以下のような感じで書いときます。
def hello_world_view(returest): return HttpResponse("<html><body>Hello World!</body></html>")
これで、 http://127.0.0.1:8000/
にHTTPサーバーが起動してます。
で、telnetで接続して見る。
$ telnet 127.0.0.1 8000
接続すると以下のように表示されます。
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'.
あとは、自分でHTTPプロトコルで通信してみます。
とりあえず、こんな感じで打ってみます。(djangoで /hello
では、上記のviewが呼ばれるように指定しておきます。)
GET /hello HTTP/1.1 host:127.0.0.1
すると以下のように返ってきます!!! やった!!楽しい!!
HTTP/1.0 200 OK Date: Tue, 17 Apr 2018 15:30:31 GMT Server: WSGIServer/0.2 CPython/3.6.5 Content-Type: text/html; charset=utf-8 X-Frame-Options: SAMEORIGIN Content-Length: 38 <html><body>Hello World!</body></html>Connection closed by foreign host.
レスポンスが全て返ってくると、通信が終わってコネクションが切断されました。悲しい。さようなら
Cookieを設定して見る
次は、viewを次のように変えてます。
def hello_world_view(returest): response = HttpResponse("Hello World !") response.set_cookie('sample_key', 'sample_value') return response
再度、telnetでアクセスすると以下のようにレスポンスが返ります。
$ telnet 127.0.0.1 8000 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET /hello HTTP/1.1 host:127.0.0.1 HTTP/1.0 200 OK Date: Tue, 17 Apr 2018 15:40:01 GMT Server: WSGIServer/0.2 CPython/3.6.5 Content-Type: text/html; charset=utf-8 X-Frame-Options: SAMEORIGIN Content-Length: 13 Set-Cookie: sample_key=sample_value; Path=/ Hello World !Connection closed by foreign host.
なるほどー、Cookieが返ってきた。
Django便利だなー。あと、ブラウザもこれを並列でやりながら画面上にhtmlをレンダリングしてると考えると、すごい。しかも、クッキーも覚えて管理してくれる。すごい。すごく便利。
終わり
もう少し色々やりたい気持ちはあるんですが、やりだすと止まらない感はあるので、今回はこの辺で。
気が向いた時にHTTPのヘッダーのパラメータ一覧をもう一度見直したい。 あと、HTTPSでの通信ができないか、という話もちょっと気になる。