Проблема проста — хочу передать POST-запрос через http-прокси в Python на сокетах, но или возникают различные ошибки SocketError, или код просто зависает на передаче (send/sendall) или приёме (recv/recvall) данных.
Скажите, в чём причина такого поведения (или, даже лучше, посоветуйте рабочий вариант)?
Это локальная часть скрипта для «прокси через прокси». Локальный прокси получает данные, кодирует их в base64 и отправляет на сервер через прокси, который нужно обойти. Сервер декодирует и делает запрос к ресурсу.
Что за HTTP-прокси? По идее POST они должны пропускать без проблем… Возможно Вы send без проверки отправки данных делаете? Шлете в конце \r\n?
Много вопросов встает, покажите код.
Во-первых, send используется в loop типа
m = 0
while m < len(object):
m = sock.send(object[m:])
или что-то вроде того (можно буфер object уменьшать, если с памятью проблема — но нагрузка на проц тогда)
или использовать sendall()
во-вторых, у Вас прописан HTTP/1.1 а Connection: close нет — может вызывать баги при коннекте.
в-третьих Вы посылаете на 4 байта больше, чем прописываете в Content-length (\r\n\r\n в конце)
Может еще что замечу скажу. Например от local_client.send(gate_client.recv(4096)) # BUG HERE, in recv тут действительно баг
должно быть что-то вроде
data = gate_client.recv(4096)
if not data:
break
local_client.sendall(data)
Да и верхний recv тоже не верен (тот который от local_client), вдруг данных будет > чем 4096? сокет будет писать, а Вы пошлете ему данные — непорядочек…