如何使用telnet或原始套接字发布文件?

时间:2011-05-10 08:34:16

标签: python sockets file-upload http-post

我正在尝试在原始套接字中发布文件,我阅读了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 个答案:

答案 0 :(得分:1)

零件标题中是否应该有'Content-Length'?

答案 1 :(得分:1)

由于你已经找到了你将使用的标题,我建议把它放进去 像这样的多行字符串:

# 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)

这就是它。 python的真正禅是实际的编码 部分非常简单,真正的挑战在于你用它编码。

我正在编写一个带有原始套接字的HTTP程序。它将是一个xchat脚本 使用babelfish.yahoo.com在外国发言人的IRC上翻译消息。

答案 2 :(得分:0)

标头的每一行必须以CRLF终止。见这里:http://tools.ietf.org/html/rfc2616#section-5