Ręczne żądanie HTTP (S)

10

Szukam narzędzia (prawdopodobnie w systemie Linux), które pozwoli mi na ręczne wysłanie żądania HTTP lub HTTPS. Mówiąc ręcznie, naprawdę mam na myśli: powinienem móc podać mu plik tekstowy, który wygląda

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

i docelowy adres URL (www.example.com/foo) i wyślij żądanie na adres URL. Przydałoby się co najwyżej automatyczne obliczenie nagłówka Content_Length.

Byłbym w stanie napisać takie narzędzie przy użyciu biblioteki takiej jak httplib w Pythonie, ale sam powód, dla którego go potrzebuję, to ręczne sprawdzenie, kiedy coś pójdzie nie tak z takimi bibliotekami.

Andrea
źródło
1
https konkretne pytanie: superuser.com/questions/346958/...
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Odpowiedzi:

10

wget ma opcję --post-file, która powinna działać dla Ciebie.

Edycja: Jest też Ncat , którego użyłbyś w podobny sposób jak sugestia telnet Randolfa Richardsona, z tym wyjątkiem, że obsługuje on także SSL / HTTPS:

ncat -C --ssl www.example.com 443 < input.txt > output.txt
Chris Acheson
źródło
6
Jeśli potrzebujesz HTTPS, użyj openssl zamiast netcat: openssl s_client -connect <adres>: 443
Ambroz Bizjak
1
wget --post-file doda nagłówki i użyje określonego pliku tylko dla treści żądania.
David Balažic
6

W przypadku HTTP (nie HTTPS) jedną z alternatyw dla komendy „wget”, która przychodzi na myśl, jest użycie telnet w następujący sposób:

  • nazwa hosta telnet 80 <input.txt> output.txt

Plik „input.txt” to lista wstępnie ustawionych poleceń, które chcesz przekazać hostowi pod nazwą hosta, a plik „output.txt” zapisze odpowiedź.

Randolf Richardson
źródło
1
To sprawiło, że zastanawiałem się, czy netcat obsługuje protokół SSL, a oto Ncat, klon netcat z obsługą SSL.
Chris Acheson
@Chris Acheson (+1): To fantastycznie! Skopiuj to, co napisałem w osobnej odpowiedzi i dostosuj je do rozwiązania wykorzystującego NetCat (jeśli to zrobię, zagłosuję na twoją odpowiedź).
Randolf Richardson
1

Możesz wydać żądanie GET za pomocą 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

Pamiętaj, że możesz także użyć „HTTP / 2”, ale bądź ostrożny, ponieważ niektóre serwery (np. Github.com) nie obsługują go.

Steven Penny
źródło
0

Dla mnie to działało tworząc plik żądania (Przykład: 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

A następnie wywołaj openssl s_clientpolecenie:

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

Uważaj jednak na niektóre punkty:

  • Plik musi być poprawnie zakodowany , zwłaszcza treść. Lepiej, jeśli dodasz nagłówek, Content-type: text/plain; charset=utf-8jeśli plik jest zakodowany w utf-8.
  • Zakończenia linii dla nagłówków muszą mieć postać CR / LF . Tylko z LF serwer WWW może zwrócić HTTP/1.1 505 HTTP Version Not Supported, ponieważ standardowy protokół HTTP używa CR / LF do zakończenia linii ( https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html ). Możesz użyć unix2dospolecenia, aby wykonać tę konwersję.
  • Dodaj Connection: closenagłówek, aby zakończyć żądanie i powrócić z połączenia. W przeciwnym razie polecenie będzie oczekiwać na interakcję użytkownika, jeśli serwer zwykle odpowiada Connection: keep-alivenagłówkiem.
F.Igor
źródło
-1

Dziwi mnie, że nikt nie wspominał o CURL . Jest wykonany dokładnie dla tego, co chcesz zrobić. I jest dostępny na praktycznie każdej platformie (w tym Windows).

Tak więc w twoim przykładzie wystarczy:

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

Który przechwycony z Wireshark dostarczy Ci:

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

Możesz z łatwością modyfikować nagłówki, jeśli chcesz robić różne rzeczy (np. Zmieniać klienta użytkownika itp.).

Edycja: Nie zauważyłem wymagania „z pliku”. Możesz to również zrobić, zarówno zwykłe pliki ascii, jak i pliki binarne. Wystarczy podać nazwę pliku za pomocą symbolu @

-d @/tmp/HelloWorldFile
Nicholi
źródło
curl jest prawie tym, czego chcę, ale wymaga ode mnie określenia nagłówków w wierszu poleceń, co jest bardzo niepraktyczne. Potrzebuję czegoś, co pozwoli mi określić pełny tekst żądania, w tym metodę i nagłówki, z pliku, a ncat robi dokładnie to, co chcę. W każdym razie dziękuję :-)
Andrea