手動のHTTP(S)リクエスト


10

手動のHTTPまたはHTTPSリクエストを作成できるツール(Linuxの場合もある)を探しています。手動で、私はそれを本当に意味します:次のようなテキストファイルをフィードできるはずです

POST /foo HTTP/1.1
Host: www.example.com
Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Content-Type: text/plain
Content-Length: 11

Hello world

および宛先URL(www.example.com/foo)を使用して、そのURLにリクエストを送信します。せいぜい、Content_Lengthヘッダーが自動的に計算されると便利です。

Pythonでhttplibのようなライブラリを使用してそのようなツールを作成することはできますが、そのようなライブラリで何か問題が発生したときに手動で調査する必要があるのはそのためです。


回答:


10

wgetには--post-fileオプションがあり、これでうまくいくはずです。

編集:また、SSL / HTTPSもサポートすることを除いて、Randolf Richardsonのtelnet提案と同様の方法で使用するNcatがあります。

ncat -C --ssl www.example.com 443 < input.txt > output.txt

6
HTTPSが必要な場合は、netcatの代わりにopensslを使用します。openssls_client -connect <address>:443
Ambroz Bizjak

1
wget --post-fileはヘッダーを追加し、指定されたファイルをリクエストの本文にのみ使用します。
David Bala Bic

6

HTTP(HTTPSではない)の場合、頭に浮かぶ「wget」コマンドの1つの代替方法は、次のようにtelnetを使用することです。

  • telnetホスト名80 <input.txt> output.txt

ファイル「input.txt」は、ホストのホストにフィードしたい事前設定コマンドのリストであり、ファイル「output.txt」は応答を保存します。


1
これにより、netcatがSSLをサポートしているかどうか、そしてSSLを有効にしたnetcatクローンであるNcatがあるかどうか疑問に思いました。
Chris Acheson、2011

@Chris Acheson(+1):それは素晴らしいですね!私が別の回答で書いたものを自由にコピーして、NetCatを利用するソリューションにそれを適応させてください(これを行う場合、私はあなたの回答に投票します)。
ランドルフリチャードソン2011

1

OpenSSLを使用してGETリクエストを発行できます。

openssl s_client -quiet -connect cdn.sstatic.net:443 <<eof
GET /stackexchange/js/universal-login.js HTTP/1.1
Connection: close
Host: cdn.sstatic.net

eof

「HTTP / 2」を使用することもできますが、一部のサーバー(github.comなど)ではサポートされていないので注意してください。


0

私にとって、それは要求ファイル(例:作成働いていましたrequest.txt

POST /foo HTTP/1.1
Host: www.example.com
Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Content-Type: text/plain; charset=utf-8
Content-Length: 11
Connection: close

Hello world

次に、openssl s_client次のコマンドを呼び出します。

cat request.txt | openssl s_client -quiet -connect www.example.com:443

ただし、次の点に注意してください。

  • ファイルは、特にコンテンツ本文を適切にエンコードする必要があります。Content-type: text/plain; charset=utf-8ファイルがutf-8でエンコードされている場合は、ヘッダーを含めるとさらに良くなります。
  • ヘッダーの行末はCR / LFでなければなりません。HTTP/1.1 505 HTTP Version Not Supported標準のHTTPプロトコルは行末にCR / LFを使用するため、LFを使用する場合のみ、Webサーバーが返すことができます(https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html)。unix2dosコマンドを使用して、この変換を行うことができます。
  • Connection: closeヘッダーを追加してリクエストを終了し、呼び出しから戻ります。それ以外の場合、サーバーが通常Connection: keep-aliveヘッダーで応答する場合、コマンドはユーザーの操作を待機します。

-1

cURLについて言及している人がいないことに驚いています。それはあなたがやりたいことのために正確に作られています。また、Windowsを含む実質的にすべてのプラットフォームで利用できます。

したがって、あなたの例では、あなたがすることはすべて次のとおりです:

curl -H 'Content-Type: text/plain' -d 'Hello World' www.example.com

Wiresharkから取得したものは、次のようになります。

POST / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: www.example.com
Accept: */*
Content-Type: text/plain
Content-Length: 11

Hello world

すべての種類のことを行いたい場合(つまり、ユーザーエージェントの変更など)、ヘッダーをさらに簡単に変更できます。

編集:「ファイルから」の要件に気付かなかった。プレーンASCIIファイルまたはバイナリファイルのいずれかでそれを行うこともできます。@記号でファイル名を指定するだけです

-d @/tmp/HelloWorldFile

curlはほとんど私が欲しいものですが、コマンドラインでヘッダーを指定する必要があるため、非常に非現実的です。メソッドとヘッダーを含むリクエストの完全なテキストをファイルから指定できる何かが必要で、ncatは思い通りに機能します。とにかくありがとう:-)
Andrea
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.