来自Network.HTTP.simpleHTTP的ErrorClosed异常 - 尝试通过带有haxr的XML-RPC上传图像

时间:2012-06-30 21:23:45

标签: wordpress http haskell upload xml-rpc

我正在尝试使用haxr 3000.8.5使用metaWeblog API将图像上传到WordPress博客 - 具体来说就是newMediaObject方法。

我已经将它用于小型图像,已经成功上传了PNG和JPG格式的20x20图标。但是,当我尝试使用中等大小的图像(例如,300x300)时,我会得到一个ErrorClosed异常,大概来自HTTP包(我做了一些源头潜水,发现haxr最终调用了{{} 3}})。

任何人都可以了解调用simpleHTTP可能导致ErrorClosed失败的原因吗?我们也欢迎您提供尝试和潜在解决方案的建议。

以下是指向Network.HTTP.simpleHTTPfull tcpdump output from a successful 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 个答案:

答案 0 :(得分: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连接,然后准备花费太长时间的数据。