7

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
4

1 に答える 1

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.]

スローロリスや同様の ddos​​ 攻撃を防ぐために、クライアントがデータを送信しなかったため、3 ~ 4 秒のタイムアウト後にサーバーによって接続が閉じられます。(F は、双方向接続の一方の方向を閉じるための FIN フラグです)。

サーバーはクライアントが接続を閉じるのを待たず (eof/0 == recv(fd) を待つ)、close() システムコールを使用します。サーバー上のカーネルは、さらにデータを受信すると、[R]eset パケットで応答します。これは、ダンプの最後に示されています。

クライアントは最初に http 接続を開いてから、時間がかかりすぎるデータを準備すると思います。

于 2012-07-02T21:23:24.040 に答える