2009/11/20

haskell hostname resolve

続きまして、HTTP でも叩こうかと思いました
直に Network.Socket を叩くよ!!

ってまぁ、流石にそんなことしてる人は沢山いらっしゃいまして
いくらでもサンプルが出てくるんですがシンプルだったのは
関数型プログラミング言語Haskell Part6
2ちゃんねるの過去ログの 607 さんでした
ちなみに検索語は "import Network.Socket"

で、挙がってた sample は
import Network.Socket 
main = putStrLn =<< do
sock <- socket AF_INET Stream 0
addr <- inet_addr "66.249.89.104" >>= \x -> return $ SockAddrInet 80 x
connect sock addr
send sock "GET / HTTP/1.1\nHost: www.google.co.jp\n\n"
recv sock 10000000 >>= \x -> sClose sock >> return x
おぉぉ

IP address ってのはちょっと寂しかったので
名前を解決してやりたいなと思いもうちょっとググりました
Network.BSD
なるほど、getHostByName 使えと
上の2ちゃんのログの 604 さんが
インタフェースはCのAPIそのままだから、そっちを調べるべき。
っつってたので
C のこと分かってればいいみたいです
わたし? えぇ、分かってないですけど

> :t getHostByName
getHostByName :: HostName -> IO HostEntry
> :i HostEntry
data HostEntry
= HostEntry {hostName :: HostName,
hostAliases :: [HostName],
hostFamily :: Network.Socket.Internal.Family,
hostAddresses :: [Network.Socket.Internal.HostAddress]}
-- Defined in Network.BSD
あと、HostName は String のこと
HostEntry の中の hostAddresses に IP address が入ってるので
> getHostByName "www.google.com" >>= return . hostAddresses
[1750726978,1666840898,2472147266,1733949762]
10進でアドレス見せてくれます

つわけで、こんなん作ったら
import System
import Network.BSD
import Network.Socket

main = do (host:path:_) <- getArgs
addr <- return . head . hostAddresses =<< getHostByName host
sock <- socket AF_INET Stream 0
connect sock (SockAddrInet 80 addr)
send sock $ "GET " ++ path ++ " HTTP/1.1\nHost: " ++ host ++ "\n\n"
putStrLn =<< recv sock 100000
sClose sock
こんなん出ました
$ ./get www.ietf.org /rfc/rfc5280.txt
HTTP/1.1 200 OK
Date: Fri, 20 Nov 2009 08:10:29 GMT
Server: Apache/2.2.4 (Linux/SUSE) mod_ssl/2.2.4 OpenSSL/0.9.8e PHP/5.2.6 with Suhosin-Patch mod_python/3.3.1 Python/2.5.1 mod_perl/2.0.3 Perl/v5.8.8
Last-Modified: Wed, 07 May 2008 17:42:25 GMT
ETag: "1caf1b6-56144-7cddc240"
Accept-Ranges: bytes
Content-Length: 352580
Vary: Accept-Encoding
Content-Type: text/plain







Network Working Group D. Cooper
Request for Comments: 5280 NIST
Obsoletes: 3280, 4325, 4630 S. Santesson
Category: Standards Track Microsoft
S. Farrell
Trinity College Dublin
S. Boeyen
Entrust
R. Housley
Vigil Security
W. Polk
NIST
May 2008


Internet X.509 Public Key Infrastructure
なんでこれ途中で切れるの?
recv に渡す数字でちゃんと表示内容変化してるのに
気付いていなかったみたいです
socket が分かっていない...

0 件のコメント:

コメントを投稿