HTTPリクエストでnetcat(nc)とカールを使用することの違いは何ですか?

HTTPリクエストでnetcat(nc)とカールを使用することの違いは何ですか?

カールを使用して特定のURLをリクエストし、200 OKの応答を受け取りました。

curl -v www.youtypeitwepostit.com
* About to connect() to www.youtypeitwepostit.com port 80 (#0)
*   Trying 54.197.246.21...
* Connected to www.youtypeitwepostit.com (54.197.246.21) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.youtypeitwepostit.com
> Accept: */*
>
< HTTP/1.1 200 OK
...

タイトルをファイルに保存する場合:

GET / HTTP/1.1
User-Agent: curl/7.29.0
Host: www.youtypeitwepostit.com
Accept: */*

ncそして、次のコマンド(netcat)を実行してみてください。

nc www.youtypeitwepostit.com 80 < file
HTTP/1.1 505 HTTP Version Not Supported
Connection: close
Server: Cowboy
Date: Wed, 02 Nov 2016 04:08:34 GMT
Content-Length: 0

別の返信を受けました。 200OKの違いと使い方は何ですかnc

リクエストヘッダに別のバージョンのHTTPを使用してみましたが、誤ったCRLFを避けるためにリクエストを手動で入力してみて、オプションのヘッダを除外してみました。結果は似ています。

ベストアンサー1

関連RFC、ハイパーテキスト転送プロトコル(HTTP / 1.1):メッセージ構文とルーティング質問に対する回答が含まれています。 HTTP要求の各行はCR / LFで終わる必要があります。


HTTP構文メッセージ形式各ヘッダー行がキャリッジリターン(0x0dASCII形式)で終わり、その後に改行(0x0a)が続くことを指定します。

 HTTP-message   = start-line
                  *( header-field CRLF )
                  CRLF
                  [ message-body ]

これは説明でより明確に表現されています。ホットラインリクエスト:

要求行はメソッドトークンで始まり、スペース(SP)、要求先、その他のスペース(SP)、プロトコルバージョンが続き、CRLFで終わります。

 request-line   = method SP request-target SP HTTP-version CRLF

HTTPリクエスト用に特別に開発されているため、curlHTTPリクエストを実行するときはすでに適切な行終端を使用しています。しかし、netcatはより一般的なプログラムです。 Unixユーティリティとして、デフォルトでは改行文字を行終端として使用するため、ユーザーは行が正しく終了することを確認する必要があります。

このunix2dosユーティリティを使用すると、要求ヘッダーを含むファイルをキャリッジリターン/ラインフィード出口を使用するように変換できます。

HTTP要求を手動で入力し、最新バージョンが必要な場合は、行末オプションを使用する必要がncあります。-CCRLF

nc -C www.youtypeitwepostit.com 80

しかし、最も広く使用されているインターネットプロトコル(SMTPなど)がCR / LF行末を使用していることは注目に値します。


一部のWebサーバー(Apacheなど)はより寛大で、改行文字で終わる要求行を許可します。 HTTP仕様はこれを可能にします。メッセージ解析の堅牢性部分:

開始ラインおよびヘッダフィールドのラインターミネータはシーケンスCRLFであるが、受信者は単一のLFをラインターミネータとして認識し、前のCRを無視することができる。

おすすめ記事