В вашем запросе есть несколько ошибок:
POST /method.php HTTP/1.1
Host: localhost
Content-Type: multipart/form-data
data1=something&data2= otherthing
Во-первых, всякий раз, когда тело используется в HTTP-запросе, длина тела должна быть известна. Обычно это делается с учетом длины впереди с Content-length
в заголовке HTTP, хотя также может использоваться фрагментное кодирование, если полная длина не известна заранее. Ваш запрос не выполняет ничего из этого, что означает, что запрос является недействительным HTTP-запросом.
Кроме того, вы претендуете на Content-Type
из multipart/form-data
, хотя ваше тело не относится к этому типу. С multipart/form-data
ваше тело будет состоять из нескольких частей MIME, разделенных текстовой границей, и эта граница должна быть объявлена в заголовке Content-type
. Правильный тип для тела, которое вы показываете, будет вместо application/x-www-form-urlencoded
.
Даже с application/x-www-form-urlencoded
тело частично не в порядке. Тело этого типа должно состоять только из пар key=value
, соединенных &
, т. Е. После ключа не должно быть места, такого же, как после data2=
, и не должно быть добавлено новых строк после конца данных, как вы есть.
При устранении всех этих проблем вам, вероятно, следует отправить следующий запрос:
body = "data1=something&data2=otherthing"
request = ("POST /method.php HTTP/1.1\r\n" + \
"Host: localhost\r\n" + \
"Content-Type: application/x-www-form-urlencoded\r\n" + \
"Content-Length: %d\r\n" + \
"\r\n%s") % (len(body),body)
Но как только вы отправите этот запрос, проблема продолжится, так как получить правильный ответ тоже сложно. Обычно я рекомендую не кодировать свою собственную обработку HTTP, если вы действительно не знаете, что делаете, а вместо этого используете существующие библиотеки. Хотя HTTP может показаться простым при рассмотрении нескольких примеров запросов, он намного сложнее, чем кажется на первый взгляд. И хотя ваш код может работать на определенных серверах, он может не работать с другими серверами.