Manuel HTTP (S) isteği


10

Manuel HTTP veya HTTPS isteği yapmama izin verecek bir araç (muhtemelen Linux'ta) arıyorum. Manuel olarak, bunu gerçekten kastediyorum: Şuna benzeyen bir metin dosyasını besleyebilmeliyim

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

ve bir hedef URL (www.example.com/foo) girin ve isteği URL'ye gönderin. En fazla, Content_Length üstbilgisinin otomatik olarak hesaplanması yararlı olacaktır.

Python'da httplib gibi bir kütüphane kullanarak böyle bir araç yazabilecektim, ancak ihtiyacımın nedeni, bu tür kütüphanelerde bir sorun olduğunda manuel araştırma yapmaktır.


Yanıtlar:


10

wget , sizin için çalışması gereken bir --post dosyası seçeneğine sahiptir.

Düzenleme: Ayrıca, SSL / HTTPS'yi desteklemesi dışında, Randolf Richardson'ın telnet önerisine benzer şekilde kullanacağınız Ncat var :

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

6
HTTPS'ye ihtiyacınız varsa, netcat yerine openssl kullanın: openssl s_client -connect <adres>: 443
Ambroz Bizjak

1
wget --post-file üstbilgileri ekler ve belirtilen dosyayı yalnızca isteğin gövdesi için kullanır.
David Balažic

6

HTTP (HTTPS değil) için, akla gelen "wget" komutunun bir alternatifi telnet'i aşağıdaki gibi kullanmaktır:

  • telnet ana bilgisayar adı 80 <input.txt> output.txt

"Girdi.txt" dosyasını en ana besleme istediklerini önceden ayarlanmış komutları sizin listesidir hostname yanıtını saklayacak "çýktý.txt" ve dosya.


1
Bu, netcat'in SSL'yi destekleyip desteklemediğini merak etmemi sağladı ve SSL özellikli bir netcat klonu olan Ncat var.
Chris Acheson

@Chris Acheson (+1): Bu harika! Lütfen yazdıklarımı ayrı bir cevapta kopyalayın ve NetCat kullanan bir çözüme uyarlayın (bunu yaparsanız cevabınıza oy vereceğim).
Randolf Richardson

1

OpenSSL ile bir GET isteği gönderebilirsiniz:

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

Ayrıca "HTTP / 2" kullanabileceğinizi unutmayın, ancak bazı sunucular (örn. Github.com) bunu desteklemediğinden dikkatli olun.


0

Benim için bir istek dosyası oluşturma çalıştı (Örnek: 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

Ve sonra openssl s_clientkomutu çağırın :

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

Ancak, bazı noktalara dikkat edin:

  • Dosyanın , özellikle içerik gövdesinin düzgün bir şekilde kodlanması gerekir. Content-type: text/plain; charset=utf-8Dosya utf-8 kodluysa bir başlık eklerseniz daha iyi olur .
  • Satır sonları başlıkları için olmalıdır CR / LF . HTTP/1.1 505 HTTP Version Not SupportedStandart HTTP protokolü satır sonları için CR / LF kullandığından yalnızca LF ile web sunucusu dönebilir ( https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html ). unix2dosBu dönüşümü yapmak için komutu kullanabilirsiniz .
  • Connection: closeİsteği sonlandırmak ve aramadan geri dönmek için bir başlık ekleyin . Aksi takdirde, sunucu normalde bir Connection: keep-alivebaşlıkla yanıt verirse, komut kullanıcı etkileşimi için bekler.

-1

Kimsenin cURL'den bahsetmediğine şaşırdım . Bu yapıldığında tam olarak yapmak istediğiniz şey için. Ve hemen hemen her platformda (Windows dahil) mevcuttur.

Örneğiniz için tek yapmanız gereken:

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

Wireshark'tan yakalananlar sizi netleştirecek:

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

Her türlü işi yapmak istiyorsanız (örneğin, kullanıcı-aracısını değiştirmek vb.) Başlıkları kolayca değiştirebilirsiniz.

Düzenleme: "Bir dosyadan" gereksinimi fark etmedi. Bunu düz ascii veya ikili dosyalar olarak da yapabilirsiniz. Dosya adını sadece @ simgesiyle belirtirsiniz

-d @/tmp/HelloWorldFile

curl neredeyse istediğim şey, ama komut satırında çok pratik olmayan üstbilgileri belirtmemi gerektiriyor. Bana bir dosyadan yöntem ve başlıklar da dahil olmak üzere isteğin tam metnini belirtmek için izin veren bir şeye ihtiyacım var ve ncat istediğim eaxctly yapar. Yine de teşekkür ederim :-)
Andrea
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.