我正在尝试在原始套接字中发布文件,我阅读了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)
有什么想法吗?
答案 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