【发布时间】:2012-07-01 22:18:47
【问题描述】:
我正在尝试使用 haxr 3000.8.5 将图像上传到使用 metaWeblog API 的 WordPress 博客——具体来说,是 newMediaObject 方法。
我已经让它适用于 small 图像,成功上传了 PNG 和 JPG 格式的 20x20 图标。但是,当我尝试中等大小的图像(比如 300x300)时,我得到了一个 ErrorClosed 异常,大概来自 HTTP 包(我做了一些源代码潜水,发现 haxr 最终调用 Network.HTTP.simpleHTTP)。
谁能解释为什么调用simpleHTTP 可能会因ErrorClosed 而失败?也欢迎提出尝试和潜在解决方法的建议。
这里是full tcpdump output from a successful upload 和from 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
【问题讨论】:
-
您是否尝试过使用 tcpdump 或 wireshark 来检查 HTTP 会话?
-
感谢您的建议。我真的对网络知之甚少,尤其是在调试方面。我在问题中添加了一些 tcpdump 输出。
-
@BrentYorgey:我认为您会希望将该输出编辑到您的问题中。即使它设法适合您在评论中获得的有限空间,在此处阅读格式正确也容易得多。
-
是的,抱歉,按 Enter 太快了。
-
默认输出没有足够的有用信息。我建议安装 Wireshark 或使用“tcpdump -s 0 -X”来获取完整的数据包。
标签: wordpress http haskell upload xml-rpc