2012-06-30 48 views
7

我試圖使用haxr 3000.8.5將圖像上傳到WordPress博客使用metaWeblog API ---特別是, newMediaObject方法。Network.HTTP.simpleHTTP的ErrorClosed異常 - 試圖通過XML-RPC與haxr上傳圖像

我已經得到它的工作圖像,成功上傳PNG和JPG格式的20x20圖標。然而,當我嘗試中等大小的圖片時(例如300x300),我會得到一個ErrorClosed例外,大概是從HTTP包(我做了一些源代碼潛水,發現haxr最終調用Network.HTTP.simpleHTTP)。

任何人都可以闡明爲什麼呼叫simpleHTTP可能會失敗,ErrorClosed?建議嘗試和潛在的解決方法也是受歡迎的。

以下是鏈接到full tcpdump output from a successful uploadfrom an unsuccessful upload

(消毒)代碼也顯示在下面,以防它有任何用處。

import   Network.XmlRpc.Client  (remote) 
import   Network.XmlRpc.Internals (Value(..), toValue) 
import   Data.Char     (toLower) 
import   System.FilePath   (takeFileName, takeExtension) 
import qualified Data.ByteString.Char8 as B 
import   Data.Functor    ((<$>)) 

uploadMediaObject :: FilePath -> IO Value 
uploadMediaObject file = do 
    media <- mkMediaObject file 
    remote "http://someblog.wordpress.com/xmlrpc.php" "metaWeblog.newMediaObject" 
    "default" "username" "password" media 

-- Create the required struct representing the image. 
mkMediaObject :: FilePath -> IO Value 
mkMediaObject filePath = do 
    bits <- B.unpack <$> B.readFile filePath 
    return $ ValueStruct 
    [ ("name", toValue fileName) 
    , ("type", toValue fileType) 
    , ("bits", ValueBase64 bits) 
    ] 
    where 
    fileName = takeFileName filePath 
    fileType = case (map toLower . drop 1 . takeExtension) fileName of 
       "png" -> "image/png" 
       "jpg" -> "image/jpeg" 
       "jpeg" -> "image/jpeg" 
       "gif" -> "image/gif" 

main = do 
    v <- uploadMediaObject "images/puppy.png" 
    print v 
+1

您是否嘗試過使用tcpdump或wireshark來檢查HTTP會話? –

+0

感謝您的建議。我對網絡知之甚少,特別是在調試方面。我已經爲該問題添加了一些tcpdump輸出。 –

+0

@BrentYorgey:我想你會想把這個輸出編輯成你的問題。在這裏閱讀格式正確的格式要容易得多,即使它能夠適應您留言評論的有限空間。 –

回答

4
21:59:56.813021 IP 192.168.1.148.39571 > ..http: Flags [.] 
22:00:01.922598 IP ..http > 192.168.1.148.39571: Flags [F.] 

的連接是通過服務器3-4秒超時後關閉作爲客戶端沒有發送任何數據,以防止slowloris和類似的DDoS攻擊。 (F是FIN標誌,關閉雙向連接的一個方向)。

服務器不等待客戶端關閉連接(等待eof/0 == recv(fd)),但使用close()系統調用;如果您收到更多數據,服務器上的內核將使用[R] eset數據包進行響應,如您在轉儲結束時所看到的那樣。

我猜客戶端首先打開http連接,然後準備需要的時間太長的數據。

+0

謝謝,這正是我需要知道的!事實證明,Haskell的懶惰讓我大吃一驚。修復是非平凡的(需要修補haxr),但我現在已經開始工作了。 –