Manuelle HTTP (S) -Anforderung

10

Ich suche ein Tool (möglicherweise unter Linux), mit dem ich eine manuelle HTTP- oder HTTPS-Anfrage stellen kann. Mit manuell meine ich es wirklich so: Ich sollte in der Lage sein, ihm eine Textdatei zuzuführen, die aussieht

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

und eine Ziel-URL (www.example.com/foo) und senden Sie die Anfrage an die URL. Es wäre höchstens nützlich, wenn der Content_Length-Header automatisch berechnet würde.

Ich könnte ein solches Tool mit einer Bibliothek wie httplib in Python schreiben, aber genau der Grund, warum ich es brauche, ist die manuelle Untersuchung, wenn bei solchen Bibliotheken etwas schief geht.

Andrea
quelle
1
https spezifische Frage: superuser.com/questions/346958/…
Ciro Santilli 法轮功 病毒 审查 六四 事件 法轮功

Antworten:

10

wget hat eine --post-file Option, die für Sie funktionieren sollte.

Bearbeiten: Außerdem gibt es Ncat , das Sie ähnlich wie Randolf Richardsons Telnet-Vorschlag verwenden würden, außer dass es auch SSL / HTTPS unterstützt:

ncat -C --ssl www.example.com 443 < input.txt > output.txt
Chris Acheson
quelle
6
Wenn Sie HTTPS benötigen, verwenden Sie openssl anstelle von netcat: openssl s_client -connect <Adresse>: 443
Ambroz Bizjak
1
wget --post-file fügt Header hinzu und verwendet die angegebene Datei nur für den Hauptteil der Anforderung.
David Balažic
6

Für HTTP (nicht HTTPS) besteht eine Alternative zum Befehl "wget" darin, Telnet wie folgt zu verwenden:

  • Telnet-Hostname 80 <input.txt> output.txt

Die Datei "input.txt" ist Ihre Liste voreingestellter Befehle, die Sie unter Hostname an den Host senden möchten, und die Datei "output.txt" speichert die Antwort.

Randolf Richardson
quelle
1
Ich habe mich gefragt, ob Netcat SSL unterstützt, und siehe da, es gibt Ncat, einen SSL-fähigen Netcat-Klon.
Chris Acheson
@ Chris Acheson (+1): Das ist fantastisch! Bitte kopieren Sie das, was ich geschrieben habe, in eine separate Antwort und passen Sie es an eine Lösung an, die NetCat verwendet (ich werde für Ihre Antwort stimmen, wenn Sie dies tun).
Randolf Richardson
1

Sie können eine GET-Anfrage mit OpenSSL stellen:

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

Beachten Sie, dass Sie auch "HTTP / 2" verwenden können. Seien Sie jedoch vorsichtig, da einige Server (z. B. github.com) dies nicht unterstützen.

Steven Penny
quelle
0

Für mich war es eine Anfrage - Datei erstellen (Beispiel: 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

Und dann rufen Sie den openssl s_clientBefehl auf:

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

Seien Sie jedoch in einigen Punkten vorsichtig:

  • Die Datei muss ordnungsgemäß codiert sein , insbesondere der Inhaltskörper. Besser, wenn Sie einen Header Content-type: text/plain; charset=utf-8einfügen, wenn die Datei utf-8-codiert ist.
  • Die Zeilenenden für die Header müssen CR / LF sein . Nur mit LF konnte der Webserver zurückkehren HTTP/1.1 505 HTTP Version Not Supported, da das Standard-HTTP-Protokoll CR / LF für Zeilenenden verwendet ( https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html ). Sie können den unix2dosBefehl verwenden, um diese Konvertierung durchzuführen.
  • Füge hinzu ein Connection: close Header hinzu, um die Anforderung zu beenden und vom Anruf zurückzukehren. Andernfalls wartet der Befehl auf die Benutzerinteraktion, wenn der Server normalerweise mit einem Connection: keep-aliveHeader antwortet .
F.Igor
quelle
-1

Ich bin überrascht, dass niemand cURL erwähnt hat . Es ist genau für das gemacht , was Sie tun möchten. Und es ist auf praktisch jeder Plattform (einschließlich Windows) verfügbar.

Für Ihr Beispiel würden Sie also nur Folgendes tun:

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

Was von Wireshark aufgenommen wurde, bringt Ihnen Folgendes ein:

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

Sie können die Header leicht weiter modifizieren, wenn Sie alle möglichen Dinge tun möchten (z. B. den Benutzeragenten ändern usw.).

Bearbeiten: Die Anforderung "Aus einer Datei" wurde nicht bemerkt. Sie können dies auch tun, entweder einfache ASCII- oder Binärdateien. Sie geben einfach den Dateinamen mit einem @ -Symbol an

-d @/tmp/HelloWorldFile
Nicholi
quelle
Curl ist fast das, was ich will, aber ich muss die Überschriften in der Befehlszeile angeben, was sehr unpraktisch ist. Ich benötige etwas, mit dem ich den vollständigen Text der Anforderung, einschließlich der Methode und der Header, aus einer Datei angeben kann, und ncat macht genau das, was ich will. Trotzdem danke :-)
Andrea