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.
Odpowiedzi:
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:
źródło
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:
Plik „input.txt” to lista wstępnie ustawionych poleceń, które chcesz przekazać hostowi pod nazwą hosta, a plik „output.txt” zapisze odpowiedź.
źródło
Możesz wydać żądanie GET za pomocą OpenSSL:
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.
źródło
Dla mnie to działało tworząc plik żądania (Przykład:
request.txt
)A następnie wywołaj
openssl s_client
polecenie:cat request.txt | openssl s_client -quiet -connect www.example.com:443
Uważaj jednak na niektóre punkty:
Content-type: text/plain; charset=utf-8
jeśli plik jest zakodowany w utf-8.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ćunix2dos
polecenia, aby wykonać tę konwersję.Connection: close
nagłó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 odpowiadaConnection: keep-alive
nagłówkiem.źródło
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:
Który przechwycony z Wireshark dostarczy Ci:
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 @
źródło