HTTPを理解するために、telnetでWebサーバーにリクエストを送ってみる

HTTP通信について改めて学習。
コマンドラインで簡単にWebサーバーに対してリクエストを送れる「Telnet」の使い方も分かったので、それを解説。

telnetインストール

Homebrewを使ってインストール。

$ brew install telnet  

GETリクエストを送る

試しにGoogleのトップページにリクエストを送ってみる。
まずはtelnet www.google.com 80でGoogleのサーバーに接続。
80番ポートを指定している。

その後にメソッド パス名 HTTP/バージョンでリクエストを送る。
ヘッダには必ずHost: ホスト名でホスト名を指定しなくてはならない。
入力が終わったら二回エンターを押す。

$ telnet dummy-bootcamp-fjord-jp.herokuapp.com 80  
Trying 3.231.91.211...  
Connected to us-east-1-a.route.herokuapp.com.  
Escape character is '^]'.  
GET /articles/1 HTTP/1.1 # ここから入力   
Host: dummy-bootcamp-fjord-jp.herokuapp.com # 二回エンター  

HTTP/1.1 200 OK  
Server: Cowboy  
Date: Tue, 19 Nov 2019 05:28:31 GMT  
Connection: keep-alive  
X-Frame-Options: SAMEORIGIN  
X-Xss-Protection: 1; mode=block  
X-Content-Type-Options: nosniff  
X-Download-Options: noopen  
X-Permitted-Cross-Domain-Policies: none  
Referrer-Policy: strict-origin-when-cross-origin  
Content-Type: text/html; charset=utf-8  
Etag: W/"07e98995f0b6fa6c7173823ae769d563"  
Cache-Control: max-age=0, private, must-revalidate  
Set-Cookie: _dummy_session=AA3pMeGBBhhAanG3uZ0EMxcGy9dDoZUPfkRRf8QiGIOE690F4UsGzPHN10AOe5gSq0OWFFVsi%2Bt%2FeBs%2FiiLBWBXZYR9fQAwj5a8Da5gmHVWUqS5IgQA6cIi7GGZUOi7SnoVKnXhEfj927cX2Oww%3D--ILpXqk0lNdD%2FoQcO--afEw8tGIB0QZY9Hg5fpUKQ%3D%3D; path=/; HttpOnly  
X-Request-Id: 3f8ccb56-60a2-45d3-998e-3f989873f14c  
X-Runtime: 0.006974  
Transfer-Encoding: chunked  
Via: 1.1 vegur  

33b  
<!DOCTYPE html>  
<html>  
  <head>  
    <title>Dummy</title>  
    <meta name="csrf-param" content="authenticity_token" />  
<meta name="csrf-token" content="Sc7mgxI5on/WFbuwSe3GC+dJjj1nl2nVUwgKSvvM01yT1uwz+KN/lZ6qQMPT6Agg/dS+cEl/pD3klAigV9NDAA==" />  


    <link rel="stylesheet" media="all" href="/assets/application-d1be5ed5b6cb78061a7ea5e9df80c77ce9b19eb122de40305e7401ac7e02ed34.css" data-turbolinks-track="reload" />  
    <script src="/assets/application-8483c49ae067c8c2030ca05a405b92c5b91e3ae4a45d24efb3f102d271382d3b.js" data-turbolinks-track="reload"></script>  
  </head>  

  <body>  
    <div class="container">  
      <p id="notice"></p>  

<p>  
  <strong>Title:</strong>  
  test  
</p>  

<p>  
  <strong>Body:</strong>  
  test body  
</p>  

<a href="/articles/1/edit">Edit</a> |  
<a href="/articles">Back</a>  

    </div>  
  </body>  
</html>  

0  

こんな感じで200レスポンスが帰ってきたら成功。
レスポンスのボディでHTMLが送られてくるので、内容を確認できる。

POSTリクエストを送る

基本は同じだが、今度はヘッダに送信する情報の半角文字列の長さを指定し、2回エンターを押した後にパラメーターを書く。
長さが一致しないとうまくいかない。

$ telnet dummy-bootcamp-fjord-jp.herokuapp.com 80                     
Trying 54.156.219.200...  
Connected to us-east-1-a.route.herokuapp.com.  
Escape character is '^]'.  
POST /articles HTTP/1.1  
Host: dummy-bootcamp-fjord-jp.herokuapp.com  
Content-Length: 48 # 長さを指定  

article[title]=bruno&article[body]=Hello World!! #  パラメータを指定してエンター  
HTTP/1.1 302 Found  
Server: Cowboy  
Date: Tue, 19 Nov 2019 05:52:44 GMT  
Connection: keep-alive  
X-Frame-Options: SAMEORIGIN  
X-Xss-Protection: 1; mode=block  
X-Content-Type-Options: nosniff  
X-Download-Options: noopen  
X-Permitted-Cross-Domain-Policies: none  
Referrer-Policy: strict-origin-when-cross-origin  
Content-Type: text/html; charset=utf-8  
Location: http://dummy-bootcamp-fjord-jp.herokuapp.com/articles/243  
Cache-Control: no-cache  
X-Request-Id: 28682fae-c8a2-484b-ad68-95bd6afea6c8  
X-Runtime: 0.032121  
Transfer-Encoding: chunked  
Via: 1.1 vegur  

7b  
<html><body>You are being <a href="http://dummy-bootcamp-fjord-jp.herokuapp.com/articles/243">redirected</a>.</body></html>  
0  

telnetで簡単にリクエストとレスポンスが確認できる

例えばtelnet localhost 80とかでローカルサーバーへの接続ができるのかも確認できる。
簡単だね!