Permintaan HTTP (S) manual

10

Saya mencari alat (mungkin di Linux) yang akan memungkinkan saya untuk membuat permintaan HTTP atau HTTPS manual. Secara manual, saya benar-benar bersungguh-sungguh: Saya harus dapat memberinya file teks yang terlihat seperti itu

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

dan URL tujuan (www.example.com/foo), dan kirim permintaan ke URL. Paling-paling, akan bermanfaat jika header Content_Length dihitung secara otomatis.

Saya akan dapat menulis alat seperti itu menggunakan beberapa pustaka seperti httplib dengan Python, tetapi alasan utama saya membutuhkannya adalah untuk melakukan penyelidikan manual ketika ada masalah dengan pustaka tersebut.

Andrea
sumber
1
https pertanyaan spesifik: superuser.com/questions/346958/…
Ciro Santilli 冠状 病毒 审查 六四 六四 事件 法轮功

Jawaban:

10

wget memiliki opsi --post-file yang seharusnya cocok untuk Anda.

Sunting: Juga, ada Ncat , yang akan Anda gunakan dengan cara yang mirip dengan saran telnet Randolf Richardson, kecuali bahwa itu juga mendukung SSL / HTTPS:

ncat -C --ssl www.example.com 443 < input.txt > output.txt
Chris Acheson
sumber
6
Jika Anda membutuhkan HTTPS, gunakan openssl sebagai ganti netcat: openssl s_client -connect <address>: 443
Ambroz Bizjak
1
wget --post-file akan menambahkan header dan menggunakan file yang ditentukan hanya untuk isi permintaan.
David Balažic
6

Untuk HTTP (bukan HTTPS), salah satu alternatif dari perintah "wget" yang muncul di pikiran adalah menggunakan telnet sebagai berikut:

  • telnet hostname 80 <input.txt> output.txt

File "input.txt" adalah daftar perintah yang Anda tentukan sebelumnya yang ingin Anda beri makan ke host di nama host dan file "output.txt" akan menyimpan respons.

Randolf Richardson
sumber
1
Ini membuat saya bertanya-tanya apakah netcat mendukung SSL, dan lihatlah, ada Ncat, klon netcat yang diaktifkan SSL.
Chris Acheson
@ Chris Acheson (+1): Luar biasa! Silakan menyalin apa yang saya tulis dalam jawaban yang terpisah dan menyesuaikannya dengan solusi yang menggunakan NetCat (saya akan memilih jawaban Anda jika Anda melakukan ini).
Randolf Richardson
1

Anda dapat mengeluarkan permintaan GET dengan OpenSSL:

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

Perhatikan bahwa Anda juga dapat menggunakan "HTTP / 2", tetapi berhati-hatilah karena beberapa server (mis. Github.com) tidak mendukungnya.

Steven Penny
sumber
0

Bagi saya, itu bekerja membuat file permintaan (Contoh: 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

Dan kemudian panggil openssl s_clientperintah:

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

Namun, berhati-hatilah dalam beberapa hal:

  • File harus dikodekan dengan benar, khususnya isi konten. Lebih baik jika Anda memasukkan header Content-type: text/plain; charset=utf-8jika file tersebut dikodekan utf-8.
  • Akhir baris untuk header harus CR / LF . Hanya dengan LF server web dapat kembali HTTP/1.1 505 HTTP Version Not Supported, karena protokol HTTP standar menggunakan CR / LF untuk akhir baris ( https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html ). Anda dapat menggunakan unix2dosperintah untuk melakukan konversi ini.
  • Tambahkan Connection: closeheader untuk mengakhiri permintaan dan kembali dari panggilan. Jika tidak, perintah akan menunggu interaksi pengguna, jika server biasanya merespons dengan Connection: keep-aliveheader.
F.Igor
sumber
-1

Saya terkejut tidak ada yang menyebutkan CURL . Itu dibuat persis untuk apa yang ingin Anda lakukan. Dan itu tersedia di hampir semua platform (termasuk Windows).

Jadi untuk contoh Anda semua yang akan Anda lakukan adalah:

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

Yang ditangkap dari Wireshark akan menjaring Anda:

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

Anda dapat dengan mudah memodifikasi tajuk lebih lanjut jika Anda ingin melakukan segala macam hal (yaitu mengubah agen-pengguna, dll).

Sunting: Tidak memperhatikan persyaratan "dari file". Anda dapat melakukannya juga, baik ascii biasa atau file biner. Anda cukup menentukan nama file dengan simbol @

-d @/tmp/HelloWorldFile
Nicholi
sumber
ikal hampir apa yang saya inginkan, tetapi mengharuskan saya untuk menentukan header pada baris perintah, yang sangat tidak praktis. Saya memerlukan sesuatu yang memungkinkan saya untuk menentukan teks lengkap dari permintaan, termasuk metode dan header, dari file, dan ncat tidak sesuai dengan yang saya inginkan. Toh terima kasih :-)
Andrea