Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   POST (вопрос знатокам хардкорного HTTP) (https://javascript.ru/forum/offtopic/85853-post-vopros-znatokam-khardkornogo-http.html)

rgl 18.04.2024 12:51

POST (вопрос знатокам хардкорного HTTP)
 
Пытаюсь из браузера отправить запрос POST, как-то так
<form method="post" action="http://localhost:1234/update.txt">
    <textarea name="t7"></textarea>
    <input type="submit">
</form>


Локально запускаю программу, которая слушает указанный порт. Заполняю в браузере поле и нажимаю submit. Браузер коннектится к указанному порту и отправляет ЗАГОЛОВОК запроса. В заголовке ничего странного, в т.ч. есть Content-Length с неким ненулевым числом. Но самого контента нет, т.е. после пустой строки в конце заголовка принимающая программа не получает ничего.
Проверил на трех разных браузерах, то же самое.
Что я не так понимаю про HTTP, конктретно про POST?

Nexus 18.04.2024 13:24

Ну, тут 2 варианта: либо у вас все браузеры сломаны и отправляют только заголовки без полезной нагрузки, либо у вас сервер неправильно обрабатывает запросы post.
Возможно ожидает payload, как 'multipart/form-data', а браузер по умолчанию отправляет в 'application/x-www-form-urlencoded'.
В первое с трудом верится.

rgl 18.04.2024 13:45

1. Три разных браузера (edge, iron portable и лисица). Трудно представить что все три сломаны.
2. Сервер ничего не обрабатывает, т.е. можно сказать что сервера нет. Есть простая программа. которая принимает входящее TCP соединение и показывает все, что по нему получает. Ничего не обрабатывает, вообще о запросе POST, его формате и разных encoding понятия не имеет. А получает программа только заголовок, пустую строку в конце, и все
Код:

POST /update.txt HTTP/1.1
Host: localhost:1234
Connection: keep-alive
Content-Length: 7
Cache-Control: max-age=0
sec-ch-ua: "Microsoft Edge";v="123", "Not:A-Brand";v="8", "Chromium";v="123"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
Origin: null
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: ru,en;q=0.9,en-GB;q=0.8,en-US;q=0.7


rgl 18.04.2024 14:21

Когда вместо простой программы запрос получает штатный сервер, то все выглядит ОК. Вот пример: http://dkirusfe.bget.ru/test_post_request.html
Код:
Код:

<?php
header( 'Content-Type: text/plain' );
$header = getallheaders();
foreach( $header as $k=>$v ) echo "$k: $v\n";
echo "\n";
echo file_get_contents( 'php://input' );

Вопрос, почему простая программа без апача не видит всего запроса, а только заголовок?

rgl 18.04.2024 17:47

Вопрос снимаю.
Как выяснилось, читающей программе нужно было указать опцию BINARY иначе она прекращала принимать данные увидев пустую строку


Часовой пояс GMT +3, время: 03:32.