programing

네트워크에서 오류가 발생했습니다. 예외가 발생했습니다.HTTP.simpleHTTP - haxr을 사용하여 XML-RPC를 통해 이미지 업로드 시도

lovejava 2023. 6. 28. 21:14

네트워크에서 오류가 발생했습니다. 예외가 발생했습니다.HTTP.simpleHTTP - haxr을 사용하여 XML-RPC를 통해 이미지 업로드 시도

저는 haxr 3000.8.5를 사용하여 metaWeblog API, 특히 새로운 MediaObject 메서드를 사용하여 WordPress 블로그에 이미지를 업로드하려고 합니다.

저는 PNG와 JPG 형식으로 20x20 아이콘을 성공적으로 업로드하여 작은 이미지에 사용할 수 있도록 했습니다.하지만 중간 크기의 이미지(예: 300x300)를 시도하면ErrorClosed예외, 아마도 HTTP 패키지에서 (나는 약간의 소스 다이빙을 했고, 그것이 궁극적으로 호출한다는 것을 발견했습니다).

누군가가 왜 전화를 했는지 이유를 밝혀줄 수 있습니까?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
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초의 시간 초과 후 서버가 연결을 종료하여 슬로우로리스 및 유사한 ddos 공격을 방지합니다. (F는 양방향 연결의 한 방향을 닫는 FIN 플래그입니다.)

서버는 클라이언트가 연결을 닫을 때까지 기다리지 않고(eof/0 == recv(dump)를 사용합니다. 서버의 커널은 덤프 끝에 표시된 것처럼 추가 데이터를 수신하면 [R]eset 패킷으로 응답합니다.

클라이언트가 먼저 http 연결을 열고 시간이 너무 오래 걸리는 데이터를 준비하는 것 같습니다.

언급URL : https://stackoverflow.com/questions/11277788/errorclosed-exception-from-network-http-simplehttp-trying-to-upload-images-vi