HTTP (S) вручну


10

Я шукаю інструмент (можливо, в Linux), який дозволить мені зробити вручну запит HTTP або HTTPS. Під керівництвом я це справді маю на увазі: я маю змогу подати йому текстовий файл, який виглядає так

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

і цільовою URL-адресою (www.example.com/foo), і надішліть запит до URL-адреси. Щонайбільше, було б корисно, якби заголовок Content_Length був автоматично обчислений.

Я міг би написати такий інструмент, використовуючи бібліотеку на зразок httplib в Python, але сама причина мені потрібна в тому, щоб зробити ручне дослідження, коли з такими бібліотеками щось піде не так.


Відповіді:


10

wget має варіант --post-file, який повинен працювати для вас.

Редагувати: Крім того, є Ncat , який ви б використовували аналогічно пропозиції телнету Рендольфа Річардсона, за винятком того, що він також підтримує SSL / HTTPS:

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

6
Якщо вам потрібен HTTPS, використовуйте openssl замість netcat: openssl s_client -connect <адреса>: 443
Ambroz Bizjak

1
wget --post-file додасть заголовки та використовуватиме вказаний файл лише для тіла запиту.
Девід Балажич

6

Для HTTP (не HTTPS) однією з альтернатив команді "wget", яка спадає на думку, є використання telnet таким чином:

  • ім'я хоста telnet 80 <input.txt> output.txt

Файл "input.txt" - це ваш список заздалегідь встановлених команд, які ви хочете подати хосту під ім'ям хоста, а файл "output.txt" буде зберігати відповідь.


1
Це змусило мене замислитися, чи підтримує netcat SSL, і ось, і ось, є Ncat, клон netcat з підтримкою SSL.
Кріс Ачесон

@Chris Acheson (+1): Це фантастично! Будь ласка, скопіюйте те, що я написав в окремій відповіді, і адаптуйте його до рішення, яке використовує NetCat (якщо ви це зробите), я проголосую за вашу відповідь.
Рендольф Річардсон

1

Ви можете надіслати запит GET за допомогою 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

Зауважте, що ви також можете використовувати "HTTP / 2", але будьте обережні, оскільки деякі сервери (наприклад, github.com) не підтримують його.


0

Для мене це працювало створення файлу запиту (приклад: 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

А потім викликайте openssl s_clientкоманду:

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

Однак будьте уважні щодо деяких моментів:

  • Файл повинен бути закодований належним чином, особливо тіло вмісту. Краще, якщо ви додасте заголовок, Content-type: text/plain; charset=utf-8якщо файл utf-8 закодований.
  • Закінчення рядків для заголовків повинні бути CR / LF . Тільки з LF веб-сервер може повернутися HTTP/1.1 505 HTTP Version Not Supported, оскільки стандартний протокол HTTP використовує CR / LF для закінчення рядків ( https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html ). Ви можете скористатися unix2dosкомандою для цього перетворення.
  • Додайте Connection: closeзаголовок, щоб припинити запит і повернутися з дзвінка. В іншому випадку команда буде чекати взаємодії з користувачем, якщо сервер зазвичай відповідає Connection: keep-aliveзаголовок.

-1

Я здивований, що ніхто не згадав CURL . Він зроблений саме для того, що ви хочете зробити. І він доступний практично на будь-якій платформі (включаючи Windows).

Тож для вашого прикладу все, що ви зробите, це:

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

Що захоплене з Wireshark буде вас сітка:

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

Ви можете легко змінювати заголовки далі, якщо хочете робити всі види матеріалів (тобто змінювати користувальницький агент тощо).

Редагувати: не помітили вимогу "з файлу". Ви також можете це робити, або звичайні файли ascii, або двійкові файли. Ви просто вказуєте ім'я файла символом @

-d @/tmp/HelloWorldFile

curl - це майже те, що я хочу, але вимагає від мене вказати заголовки в командному рядку, що дуже недоцільно. Мені потрібно щось, що дозволяє мені вказати повний текст запиту, включаючи метод та заголовки, з файлу, і ncat виконує полегшене те, що я хочу. Все одно дякую :-)
Андреа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.