リダイレクトをたどる
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
むむむ……