Bre*_*gey 7 wordpress upload haskell xml-rpc http
我正在尝试使用haxr 3000.8.5 使用metaWeblog API(特别是newMediaObject方法)将图像上传到WordPress博客.
我已经成功地为小图像工作,成功上传了PNG和JPG格式的20x20图标.但是,当我尝试中等大小的图像(例如,300x300)时,我得到一个ErrorClosed
例外,大概来自HTTP包(我做了一些源头潜水,发现haxr最终调用Network.HTTP.simpleHTTP
).
任何人都可以解释为什么呼叫simpleHTTP
可能失败的原因ErrorClosed
?我们也欢迎您提供尝试和潜在解决方案的建议.
以下是成功上传和不成功上传的完整tcpdump输出的链接.
(已消毒的)代码也显示如下,以防任何用途.
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
Run Code Online (Sandbox Code Playgroud)
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.]
Run Code Online (Sandbox Code Playgroud)
由于客户端没有发送任何数据,服务器会在 3-4 秒超时后关闭连接,以防止 Slowloris 和类似的 ddos 攻击。(F是FIN标志,关闭一个方向的双向连接)。
服务器不等待客户端关闭连接(等待 eof/0 == recv(fd)),而是使用 close() 系统调用;如果服务器上的内核收到更多数据,它将以 [R]eset 数据包进行响应,如您在转储末尾所看到的。
我猜客户端首先打开http连接,然后准备数据,这花费了太长时间。