From: pho Date: Sun, 5 Jul 2009 09:31:25 +0000 (+0900) Subject: Voker57's fix for getRemoteAddr' only works on little-endian architectures. We should... X-Git-Tag: RELEASE-0_3_2~1 X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Lucu.git;a=commitdiff_plain;h=d0558f77cf306aa2cab58a71aeecff04c1ffcd06 Voker57's fix for getRemoteAddr' only works on little-endian architectures. We should let getNameInfo do the work instead of hand-written decoder. Ignore-this: c425d7e5c2faecde880d01d684967d71 darcs-hash:20090705093125-62b54-ec72d6afcf735ef68a34d25466688314af943b98.gz --- diff --git a/Lucu.cabal b/Lucu.cabal index f6e887e..d9f6fc8 100644 --- a/Lucu.cabal +++ b/Lucu.cabal @@ -8,7 +8,7 @@ Description: messing around FastCGI. It is also intended to be run behind a reverse-proxy so it doesn't have some facilities like logging, client filtering or such like. -Version: 0.3 +Version: 0.3.1 License: PublicDomain License-File: COPYING Author: PHO @@ -43,7 +43,7 @@ Flag build-lucu-implant-file Library Build-Depends: - HsOpenSSL, base >= 4, bytestring, containers, dataenc, + HsOpenSSL, base >= 4 && < 5, bytestring, containers, dataenc, directory, haskell-src, hxt, mtl, network, stm, time, unix, zlib Exposed-Modules: diff --git a/NEWS b/NEWS index fc0a8fb..2ee14bc 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,10 @@ +Changes from 0.3 to 0.3.1 +------------------------- +* Network.HTTP.Lucu.Resource: + - Bugfix: getRemoteAddr' didn't work on little-endian architectures. (Thanks: Voker57) + - Bugfix: getRemoteAddr' didn't work for IPv6 network. + - New function: getRemoteHost + Changes from 0.2.1 to 0.3 ------------------------- * Added SSL support: diff --git a/Network/HTTP/Lucu/Resource.hs b/Network/HTTP/Lucu/Resource.hs index e48ea21..3a27e9c 100644 --- a/Network/HTTP/Lucu/Resource.hs +++ b/Network/HTTP/Lucu/Resource.hs @@ -73,6 +73,7 @@ module Network.HTTP.Lucu.Resource , getConfig , getRemoteAddr , getRemoteAddr' + , getRemoteHost , getRemoteCertificate , getRequest , getMethod @@ -136,7 +137,6 @@ module Network.HTTP.Lucu.Resource import Control.Concurrent.STM import Control.Monad.Reader -import Data.Bits import qualified Data.ByteString as Strict (ByteString) import qualified Data.ByteString.Lazy as Lazy (ByteString) import qualified Data.ByteString.Char8 as C8 hiding (ByteString) @@ -211,20 +211,15 @@ getRemoteAddr = do itr <- getInteraction -- you want a 'Network.Socket.SockAddr' instead of 'Prelude.String', -- use 'getRemoteAddr'. getRemoteAddr' :: Resource String -getRemoteAddr' = do addr <- getRemoteAddr - case addr of - -- Network.Socket は IPv6 を考慮してゐないやうだ… - SockAddrInet _ v4addr - -> let b1 = (v4addr `shiftR` 24) .&. 0xFF - b2 = (v4addr `shiftR` 16) .&. 0xFF - b3 = (v4addr `shiftR` 8) .&. 0xFF - b4 = v4addr .&. 0xFF - in - return $ concat $ intersperse "." $ map show [b4, b3, b2, b1] - SockAddrUnix path - -> return path - _ - -> undefined +getRemoteAddr' = do addr <- getRemoteAddr + (Just str, _) <- liftIO $! getNameInfo [NI_NUMERICHOST] True False addr + return str + +-- |Resolve an address to the remote host. +getRemoteHost :: Resource String +getRemoteHost = do addr <- getRemoteAddr + (Just str, _) <- liftIO $! getNameInfo [] True False addr + return str -- | Return the X.509 certificate of the client, or 'Nothing' if: --