matobaの学んだこと

とあるPythonエンジニアのブログ。ソフトウェア開発、執筆活動、ライフログ。

telnetでhttp接続して遊んでただけの話

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での通信ができないか、という話もちょっと気になる。