haxr 3000.8.5 を使用して、metaWeblog API、具体的にはnewMediaObjectメソッドを使用して画像をWordPressブログにアップロードしようとしています。
PNG と JPG の両方の形式で 20x20 のアイコンを正常にアップロードして、小さな画像でも機能するようになりました。ただし、中サイズの画像 (たとえば、300x300) を試してみると、おそらくHTTPErrorClosed
パッケージから例外が発生します (少しソース ダイビングを行ったところ、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