Как разместить файл с помощью telnet или необработанного сокета? - PullRequest
0 голосов
/ 10 мая 2011

Я пытаюсь опубликовать файл в необработанном сокете, я читаю RFC, и я думаю, что я действительно протестировал много вариантов, но я застрял.

Кстати, я знаю, что могу использовать pycurl, httplib и т. Д., Но я действительно хочу сделать это вручную.

Вот запрос:

POST /upload.php?foo=bar HTTP/1.0
Host: localhost
User-Agent: Mozilla/5.0
Content-Type: multipart/form-data; boundary=9afb0c26-7adf-11e0-b167-1c6f65955350

--9afb0c26-7adf-11e0-b167-1c6f65955350
Content-Disposition: form-data; name="files[]"; filename="image.png"
Content-Type: image/png

#PNG

IHD&#   )IDA##x##       D
                         [##
###b######j
5#r#`IEND#B`#
--9afb0c26-7adf-11e0-b167-1c6f65955350--

Все эти строки взяты из массивов:

"\n".join(lines)

Я пробовал оба с \ n & \ r \ n

И я отправляю в CRLF в конце.

Я читаю свои изображения так:

f = open(file, 'rb')
file_content = ''
while True:
    chunck = f.read(1024)
    file_content += chunck
    if len(chunck) == 0:
        break;

lines.append(file_content)

Есть идеи?

Ответы [ 3 ]

1 голос
/ 10 мая 2011

Разве в заголовках части не должно быть 'Content-Length'?

1 голос
/ 15 октября 2011

Поскольку вы уже выяснили, какой заголовок вы будете использовать, я рекомендую поместить его в многострочная строка вроде этого:

# An infinitely clever way to make \r\n\r\n at end of header, although technically
# inferior to just going rnrn = '\r\n\r\n' tho.  Shut up...
rnrn = '\n'.join('\r\r\r')[:4]

# remember that each line in an http header must be terminated with \r\n.
# Since multiline strings already add a \n terminator at the end of each line, 
# all that is needed is \r at the end of each line.

header = """POST /upload.php?foo=bar HTTP/1.0\r
Host: localhost\r
User-Agent: Mozilla/5.0\r
Content-Type: multipart/form-data; boundary=9afb0c26-7adf-11e0-b167-1c6f65955350\r
--9afb0c26-7adf-11e0-b167-1c6f65955350\r
Content-Disposition: form-data; name="files[]"; filename="image.png"\r
Content-Type: image/png\r
#PNG\r
IHD&#   )IDA##x##       D\r
                     [##\r
###b######j\r
5#r#`IEND#B`#\r
--9afb0c26-7adf-11e0-b167-1c6f65955350--"""+rnrn

HOST = '' #your hostname here
PORT = 0 #your port here

from socket import *
s = socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))

s.send(header)
return_data = s.recv(1024)
s.close()

print('Got back: ', return_data)

И это во многом. Настоящий дзен питона в том, что собственно кодирование часть действительно проста, реальная проблема в том, что вы кодируете с ней.

Я сам пишу программу HTTP с необработанными сокетами. Это будет скрипт xchat который использует babelfish.yahoo.com для перевода сообщений по IRC от иностранных пользователей.

0 голосов
/ 10 мая 2011

Каждая строка заголовка должна заканчиваться CRLF. Смотрите здесь: http://tools.ietf.org/html/rfc2616#section-5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...