2011-05-10 57 views
0

我想在一個原始套接字中發佈一個文件,我讀了RFC,並且我想我實際上測試了很多選項,但現在我被卡住了。順便說一句,我知道我可以使用pycurl,httplib等,但我真的想做它manualy。如何使用telnet或原始套接字發佈文件?

在這裏,請求:

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

祝你好運,起初我很想嘗試找出問題,但第二想到這是一個瘋狂的想法。我無法想象當你用'urllib2','twisted'或'scrapy'這麼簡單的時候,你爲什麼要這麼做(你有什麼樣的http錯誤處理方法???) – 2011-05-10 08:39:09

+0

這不是[原始套接字](http://en.wikipedia.org/wiki/Raw_socket)。 – 2011-10-15 21:38:16

回答

1

不應該在部分頭文件中的'內容長度'?

+0

RFC聲明它是可選的,但是,我試圖定義一個,但沒有成功 – JohnT 2011-05-10 09:22:23

+0

究竟發生了什麼?如在,服務器端說什麼?一些服務器端實現需要'內容'長度,以便他們知道會有多少。 – 2011-05-15 18:24:10

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消息。

+1

[喬治理由再次]你可能真的想要 - 而不是我只是把代碼與頭,實際上去「」「+ imgdata +」「」...所以它會是什麼你的圖像生成器從文件的東西想出了。 – 2011-10-15 14:11:31