Я перехватил запрос с помощью Burp, поэтому Я знаю, что запрос будет идеальным и будет работать .
Только это не так:
message = "POST /project2/public/addJoke.php HTTP/1.1
...
upgrade-Insecure-Requests: 1
joketext=test200&authorid=1"
При некотором базовом понимании HTTP можно увидеть, что нет маркера, который заканчивает заголовок HTTP и запускает тело HTTP, т.е. отсутствует пустая строка между заголовком и телом.Это означает, что joketext=test200&authorid=1
обрабатывается сервером как часть заголовка (хотя и с неверным синтаксисом) и что, поскольку маркер конца заголовка не используется, заголовок считается неполным и, следовательно, тело не обнаруживается.Вторая проблема заключается в том, что используемый вами конец строки, вероятно, \n
, а не \r\n
, как и должно быть.
Кроме того, вы предполагаете, что send
отправит все в буфере и проверит только ошибки:
if( send(s , message , strlen(message) , 0) < 0)
Only, send
такой гарантии не имеет.Вместо этого вам нужно проверить возвращаемое значение на количество фактически отправленных байтов и сделать еще один send
с любыми оставшимися (неотправленными) данными.Для таких небольших буферов вам, вероятно, понадобится всего один send
, но для более крупных буферов вы столкнетесь с проблемами.
В целом: HTTP намного сложнее, чем вы думаете, просто взглянув на какой-то HTTPЗапросы.Существует стандарт по причине, и любой, кто кодирует HTTP напрямую, должен изучить и понять стандарт.Рассматривать несколько запросов в качестве примера недостаточно, особенно если не удается достаточно внимательно изучить и, таким образом, отсутствуют детали новой строки пробела, то есть, где она принадлежит и из чего состоит пробел.
РЕДАКТИРОВАТЬ: похоже, что ОП в значительной степени отредактировал код в вопросе, что теперь приводит к новым проблемам:
str2 = "POST /project2/public/addJoke.php HTTP/1.0\r\n";
str3 = "Content-Type: text/plain\r\n";
str20= "Content-Length: 12\r\n\r\n";
str5 = "joketext=ctest&jokedate=2018-01-01";
Очевидно, что длина 12, указанная в str20
, не соответствует длине фактическоготело в str5
, что составляет 34. И формуляр ожидает Content-Type
из application/x-www-form-urlencoded
вместо text/plain
.Обе вещи были правильны в первоначальном вопросе, но теперь не верны.Поэтому я еще раз повторю свою вышеупомянутую рекомендацию: "... любой, кто напрямую кодирует HTTP, должен изучить и понять стандарт. Рассматривать несколько запросов в качестве примера недостаточно ..."