
Hi everyone, I'm trying to do a number of successive HTTP requests in one program. Here's what I tried: Approach 1: I used the 'download' package, which failed to install on OS X. It fails with "error: libio.h: No such file or directory". Approach 2: I installed the 'download-curl' package, and tried again. This seems to fail on the following example:
import Network.Curl.Download
main = do x <- openURI "http://haskell.org" y <- openURI "http://haskell.org/hoogle" return ()
If I put a print statement around the second line of the do-statement it looks like openURI never returns. Approach 3: I used the simpleHTTP function from the HTTP package. This crashed, after I dug a little deeper into the code, it threw an error on calling the parseURI function (openFile: no such file exists). I installed the latest network package and upgraded my HTTP package, and the parseURI error went away. I felt like I was almost there, and tried the following:
simpleHTTP (getRequest "http://haskell.org")
This failed with just the text "Bus error". I searched the HTTPBis git repository, but couldn't find the text "Bus error". I don't have a clue of how to fix this. I'm a bit stuck here, I would love to help fix the errors, but don't know what would be the best place to begin. If anyone can point me in the right direction, I will try to patch at least one of these packages. Thanks, -chris

Hello,
On Sat, Feb 6, 2010 at 2:51 AM, Chris Eidhof
Approach 3: I used the simpleHTTP function from the HTTP package. This crashed, after I dug a little deeper into the code, it threw an error on calling the parseURI function (openFile: no such file exists). I installed the latest network package and upgraded my HTTP package, and the parseURI error went away. I felt like I was almost there, and tried the following:
simpleHTTP (getRequest "http://haskell.org")
This failed with just the text "Bus error". I searched the HTTPBis git repository, but couldn't find the text "Bus error". I don't have a clue of how to fix this.
Try reinstall network package with `cabal install --reinstall --hsc2hs-options="--cflag=-m32 --lflag=-m32"`. See also: http://hackage.haskell.org/trac/ghc/ticket/3681 Hope this helps. --nwn

Thanks. Unfortunately, it didn't help. The thing that frustrates me is that it's quite hard to debug. I guess I'll upgrade my GHC to 6.12, hopefully that'll solve it. -chris On 7 feb 2010, at 16:07, Yusaku Hashimoto wrote:
Hello,
On Sat, Feb 6, 2010 at 2:51 AM, Chris Eidhof
wrote: Approach 3: I used the simpleHTTP function from the HTTP package. This crashed, after I dug a little deeper into the code, it threw an error on calling the parseURI function (openFile: no such file exists). I installed the latest network package and upgraded my HTTP package, and the parseURI error went away. I felt like I was almost there, and tried the following:
simpleHTTP (getRequest "http://haskell.org")
This failed with just the text "Bus error". I searched the HTTPBis git repository, but couldn't find the text "Bus error". I don't have a clue of how to fix this.
Try reinstall network package with `cabal install --reinstall --hsc2hs-options="--cflag=-m32 --lflag=-m32"`.
See also: http://hackage.haskell.org/trac/ghc/ticket/3681
Hope this helps. --nwn

I should add that I was able to work around the issue by using Michael Snoyman's http-wget [1] package. It uses the command-line version of wget, which does work on my machine. -chris [1]: http://hackage.haskell.org/package/http-wget On 7 feb 2010, at 16:50, Chris Eidhof wrote:
Thanks. Unfortunately, it didn't help. The thing that frustrates me is that it's quite hard to debug. I guess I'll upgrade my GHC to 6.12, hopefully that'll solve it.
-chris
On 7 feb 2010, at 16:07, Yusaku Hashimoto wrote:
Hello,
On Sat, Feb 6, 2010 at 2:51 AM, Chris Eidhof
wrote: Approach 3: I used the simpleHTTP function from the HTTP package. This crashed, after I dug a little deeper into the code, it threw an error on calling the parseURI function (openFile: no such file exists). I installed the latest network package and upgraded my HTTP package, and the parseURI error went away. I felt like I was almost there, and tried the following:
simpleHTTP (getRequest "http://haskell.org")
This failed with just the text "Bus error". I searched the HTTPBis git repository, but couldn't find the text "Bus error". I don't have a clue of how to fix this.
Try reinstall network package with `cabal install --reinstall --hsc2hs-options="--cflag=-m32 --lflag=-m32"`.
See also: http://hackage.haskell.org/trac/ghc/ticket/3681
Hope this helps. --nwn
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

Try to reinstall HTTP package also. I think your HTTP package is still
linked with old broken network package.
HTTP depends on network. And network is a binding for network API of
OS. These API is for C-language. When ghc builds such binding
packages, It runs gcc for some purpose. gcc thinks you need 64bit
binary (from SL, I believe.) and works for 64bit environment. But ghc
on Mac can only build 32bit binaries. So it causes the problem.
You can check if network package was correctly built by running this.
This takes a host name, and gets the root document of the host via
HTTP using a socket. Build and try `./this_program haskell.org`
import Network.Socket
import System.IO
import System.Environment
getAddr :: HostName -> IO AddrInfo
getAddr host = head `fmap`
(getAddrInfo (Just defaultHints { addrSocketType = Stream })
(Just host)
(Just "http"))
connected :: HostName -> IO Socket
connected host = do
addrinfo <- getAddr host
sock <- socket (addrFamily addrinfo)
(addrSocketType addrinfo)
(addrProtocol addrinfo)
connect sock (addrAddress addrinfo)
return sock
httpGet :: HostName -> IO String
httpGet host = do
h <- flip socketToHandle ReadWriteMode =<< connected host
hSetBuffering h NoBuffering
hPutStr h "GET / HTTP/1.0\r\n\r\n"
hGetContents h
main = fmap head getArgs >>= httpGet >>= putStr
I should have mentioned them in my last mail. Sorry.
By the way, ghc-6.12 on Mac still can not build 64bit binaries. So
upgrading ghc won't solve it.
--nwn
On Mon, Feb 8, 2010 at 12:50 AM, Chris Eidhof
Thanks. Unfortunately, it didn't help. The thing that frustrates me is that it's quite hard to debug. I guess I'll upgrade my GHC to 6.12, hopefully that'll solve it.
-chris
On 7 feb 2010, at 16:07, Yusaku Hashimoto wrote:
Hello,
On Sat, Feb 6, 2010 at 2:51 AM, Chris Eidhof
wrote: Approach 3: I used the simpleHTTP function from the HTTP package. This crashed, after I dug a little deeper into the code, it threw an error on calling the parseURI function (openFile: no such file exists). I installed the latest network package and upgraded my HTTP package, and the parseURI error went away. I felt like I was almost there, and tried the following:
simpleHTTP (getRequest "http://haskell.org")
This failed with just the text "Bus error". I searched the HTTPBis git repository, but couldn't find the text "Bus error". I don't have a clue of how to fix this.
Try reinstall network package with `cabal install --reinstall --hsc2hs-options="--cflag=-m32 --lflag=-m32"`.
See also: http://hackage.haskell.org/trac/ghc/ticket/3681
Hope this helps. --nwn

Hi nwn, I had the following error: Run: Network/Socket/Internal.hsc:(298,2)-(314,60): Non-exhaustive patterns in case. The code for those lines look like this:
peekSockAddr p = do family <- (#peek struct sockaddr, sa_family) p case family :: CSaFamily of #if defined(DOMAIN_SOCKET_SUPPORT) (#const AF_UNIX) -> do str <- peekCString ((#ptr struct sockaddr_un, sun_path) p) return (SockAddrUnix str) #endif (#const AF_INET) -> do addr <- (#peek struct sockaddr_in, sin_addr) p port <- (#peek struct sockaddr_in, sin_port) p return (SockAddrInet (PortNum port) addr) #if defined(IPV6_SOCKET_SUPPORT) (#const AF_INET6) -> do port <- (#peek struct sockaddr_in6, sin6_port) p flow <- (#peek struct sockaddr_in6, sin6_flowinfo) p addr <- (#peek struct sockaddr_in6, sin6_addr) p scope <- (#peek struct sockaddr_in6, sin6_scope_id) p return (SockAddrInet6 (PortNum port) flow addr scope) #endif
Thanks for all your help. I'll first upgrade to a new GHC and then try again. -chris On 9 feb 2010, at 06:41, Yusaku Hashimoto wrote:
Try to reinstall HTTP package also. I think your HTTP package is still linked with old broken network package.
HTTP depends on network. And network is a binding for network API of OS. These API is for C-language. When ghc builds such binding packages, It runs gcc for some purpose. gcc thinks you need 64bit binary (from SL, I believe.) and works for 64bit environment. But ghc on Mac can only build 32bit binaries. So it causes the problem.
You can check if network package was correctly built by running this. This takes a host name, and gets the root document of the host via HTTP using a socket. Build and try `./this_program haskell.org`
import Network.Socket import System.IO import System.Environment
getAddr :: HostName -> IO AddrInfo getAddr host = head `fmap` (getAddrInfo (Just defaultHints { addrSocketType = Stream }) (Just host) (Just "http"))
connected :: HostName -> IO Socket connected host = do addrinfo <- getAddr host sock <- socket (addrFamily addrinfo) (addrSocketType addrinfo) (addrProtocol addrinfo) connect sock (addrAddress addrinfo) return sock
httpGet :: HostName -> IO String httpGet host = do h <- flip socketToHandle ReadWriteMode =<< connected host hSetBuffering h NoBuffering hPutStr h "GET / HTTP/1.0\r\n\r\n" hGetContents h
main = fmap head getArgs >>= httpGet >>= putStr
I should have mentioned them in my last mail. Sorry.
By the way, ghc-6.12 on Mac still can not build 64bit binaries. So upgrading ghc won't solve it.
--nwn
On Mon, Feb 8, 2010 at 12:50 AM, Chris Eidhof
wrote: Thanks. Unfortunately, it didn't help. The thing that frustrates me is that it's quite hard to debug. I guess I'll upgrade my GHC to 6.12, hopefully that'll solve it.
-chris
On 7 feb 2010, at 16:07, Yusaku Hashimoto wrote:
Hello,
On Sat, Feb 6, 2010 at 2:51 AM, Chris Eidhof
wrote: Approach 3: I used the simpleHTTP function from the HTTP package. This crashed, after I dug a little deeper into the code, it threw an error on calling the parseURI function (openFile: no such file exists). I installed the latest network package and upgraded my HTTP package, and the parseURI error went away. I felt like I was almost there, and tried the following:
simpleHTTP (getRequest "http://haskell.org")
This failed with just the text "Bus error". I searched the HTTPBis git repository, but couldn't find the text "Bus error". I don't have a clue of how to fix this.
Try reinstall network package with `cabal install --reinstall --hsc2hs-options="--cflag=-m32 --lflag=-m32"`.
See also: http://hackage.haskell.org/trac/ghc/ticket/3681
Hope this helps. --nwn

On Fri, Feb 5, 2010 at 5:51 PM, Chris Eidhof
Approach 2: I installed the 'download-curl' package, and tried again. This seems to fail on the following example:
import Network.Curl.Download
main = do x <- openURI "http://haskell.org" y <- openURI "http://haskell.org/hoogle" return ()
If I put a print statement around the second line of the do-statement it looks like openURI never returns.
I think you're supposed to use withCurlDo: http://hackage.haskell.org/packages/archive/curl/latest/doc/html/Network-Cur... with the curl library. Could be wrong about that, haven't tried it myself.
Approach 3: I used the simpleHTTP function from the HTTP package. This crashed, after I dug a little deeper into the code, it threw an error on calling the parseURI function (openFile: no such file exists). I installed the latest network package and upgraded my HTTP package, and the parseURI error went away. I felt like I was almost there, and tried the following:
simpleHTTP (getRequest "http://haskell.org")
This failed with just the text "Bus error". I searched the HTTPBis git repository, but couldn't find the text "Bus error". I don't have a clue of how to fix this.
"Bus error" is a message generated by the operating system. On OS X, it can mean a null dereference, which is very unusual. I'm not sure how you'd debug it either - the most common cause when you're talking about C applications is programmer error, but Network.HTTP is specifically designed to be pure Haskell, and it's not easy to induce a null dereference from Haskell.
I'm a bit stuck here, I would love to help fix the errors, but don't know what would be the best place to begin. If anyone can point me in the right direction, I will try to patch at least one of these packages.
I don't think anyone would blame you if you didn't manage it, none of those are particularly friendly errors.

On Sun, Feb 07, 2010 at 05:12:23PM +0000, Ben Millwood wrote:
This failed with just the text "Bus error". I searched the HTTPBis git repository, but couldn't find the text "Bus error". I don't have a clue of how to fix this. "Bus error" is a message generated by the operating system. On OS X, it can mean a null dereference, which is very unusual.
You did not mention whether the machine running your OS X was a PowerPC or an "Intel" machine. On non-x86 platforms, a bus error is usually caused by misaligned memory accesses. Unlike the x86 which silently and expensively fixes any misaligned accesses, sane processors kick and scream, resulting in a bus error. Such things tend to happen quite often when development of a software mainly takes place on x86 family chips, and are revealed when some poor soul on an UltraSparcIII tries to run them. -- Lars Viklund | zao@acc.umu.se

On 7 feb 2010, at 19:52, Lars Viklund wrote:
On Sun, Feb 07, 2010 at 05:12:23PM +0000, Ben Millwood wrote:
This failed with just the text "Bus error". I searched the HTTPBis git repository, but couldn't find the text "Bus error". I don't have a clue of how to fix this. "Bus error" is a message generated by the operating system. On OS X, it can mean a null dereference, which is very unusual.
You did not mention whether the machine running your OS X was a PowerPC or an "Intel" machine.
On non-x86 platforms, a bus error is usually caused by misaligned memory accesses. Unlike the x86 which silently and expensively fixes any misaligned accesses, sane processors kick and scream, resulting in a bus error.
Such things tend to happen quite often when development of a software mainly takes place on x86 family chips, and are revealed when some poor soul on an UltraSparcIII tries to run them.
I'm on X86, Snow Leopard. I'm running GHC 6.10.2. -chris
participants (4)
-
Ben Millwood
-
Chris Eidhof
-
Lars Viklund
-
Yusaku Hashimoto