リダイレクトをたどる

Network.HTTP の練習がてらに。
http://hackage.haskell.org/packages/archive/HTTP/4000.0.5/doc/html/Network-HTTP.html


標準入力からURLのリストを受けとって、標準出力にそれぞれの最終的なリダイレクト先の URL を表示する。

module Main where
import Network.HTTP
import Network.URI (parseURI)
import Network.Stream (Result)
import Maybe (fromJust)

followRedirectUrl :: String -> IO (String)
followRedirectUrl url = do
  ret <- simpleHTTP $ headRequest url
  case findHeader HdrLocation $ fromRight ret of
    Just loc -> followRedirectUrl loc
    Nothing -> return url
  where
    headRequest :: String -> Request String
    headRequest = mkRequest HEAD . fromJust . parseURI

    fromRight :: Result a -> a
    fromRight (Right res) = res

main = getContents >>= mapM followRedirectUrl . lines >>= mapM_ putStrLn


実行結果

% ghc -package HTTP follow-redirect-url.hs
% echo 'http://tinyurl.com/dgkxj9' | ./a.out
http://d.hatena.ne.jp/eagletmt/

追記

map系をまとめられないかなーと思ったら、こうすればいけた。

main = getContents >>= mapM_ ((=<<) putStrLn . followRedirectUrl) . lines

むむむ……