
[redirecting to haskell-cafe] Hi Jens, I think I have it.
I think I found an issue with the HTTP.hs library when making a short-lived non-persistent connection to a server from a slower machine (i486). I can also reproduce it by running my program with strace or ltrace on a faster machine (PIII).
Last two meaningful recv call:
recvfrom(3, 0x500a3878, 1000, 0, 0x500a3c68) = 555 getpeername(3, 0x500a3c8c, 0x500a3ca4, 0x080dfda0, 1) = 0 recvfrom(3, 0x500a2008, 1000, 0, 0x500a23f8) = 0 getpeername(3, 0x500a241c, 0x500a2434, 0x080dfda0, 1) = 0
After no data is received the sending part of the TCP stream is closed:
shutdown(3, 1, 0x0805b85f, 0x080e018c, 1) = 0
Being polite, the library ensures that all incoming data has been consumed, forgetting for a moment that the incoming stream has already closed:
recvfrom(3, 0x500a2440, 1000, 0, 0x500a2830) = 0 getpeername(3, 0x500a2854, 0x500a286c, 0x080e018c, 1) = -1
The "recvfrom" seems fine, the "getpeername" call comes from the definition of Network.Socket.recvFrom, which features: flg <- sIsConnected sock -- For at least one implementation (WinSock 2), recvfrom() ignores -- filling in the sockaddr for connected TCP sockets. Cope with -- this by using getPeerName instead. sockaddr <- if flg then getPeerName sock else peekSockAddr ptr_addr ...Leading to the error in question:
strerror(107) = "Transport endpoint is not connec"...
The answer I guess is to alter all calls to 'recvFrom' to 'recv' calls (done), or replace socket reference with ConnClosed at the first sign of a closed socket. Unfortunately the second will have to wait, but the first is implemented and available in the latest version: http://homepages.paradise.net.nz/warrickg/haskell/http Warrick. PS - nice trace. _________________________________________________________________ Get your FREE download of MSN Explorer at http://explorer.msn.com/intl.asp.