On 12/10/2010, at 3:07 PM, john skaller wrote:

> 
> Ok, the Felix webserver (in tools directory) is not behaving itself.
> There seems to be an attempt to write on a closed connection,
> after which the server just exits for unknown reason.


Well now I know:

Add socket wakeup
Added write filter
close read fd 17file /Users/johnskaller/Desktop/Python-Docs-2.5.2/tut/tut.html
Add socket wakeup
Added read filter
Kqueue got 1 events
EVFILT_WRITE: can write (?) 146988 bytes
got EV_EOF on write, socket = 16, data bytes =146988 (0?), errno/fflags?=0
posix faio wakeup PDEMUX_WRITE, writing..
posix_demuxer:socket_send
posix_demuxer:socket_send wrote -1 bytes
posix_demuxer: socket send failed, connection closed by client?
send: Broken pipe
Should have printed the error code above ..
posix faio wakeup PDEMUX_WRITE, connection closed = 1
faio_req=0x100504a80, Notify 0x1005037c0
faio_req=0x100504a80, FINISHED
ETHREAD CHECKING QUIT FLAG
ETHREAD ABOUT TO WAIT
Kqueue got 1 events
EVFILT_READ: got 132 bytes coming
posix faio wakeup PDEMUX_READ, reading..
posix_demuxer:socket_recv
posix_demuxer:socket_recv got 132 bytes
posix faio wakeup PDEMUX_READ, connection closed = 0
Add socket wakeup
Added read filter
ETHREAD CHECKING QUIT FLAG
ETHREAD ABOUT TO WAIT

Program received signal SIGPIPE, Broken pipe.
0x00007fff835ba316 in __semwait_signal ()
(gdb) 

So basically, an attempt to write on a broken connection leading
to SIGPIPE killing the program .. grrr ... :)

I'm not sure how to fix this, in fact I'm not sure it is POSSIBLE to
fix it ;( [Other than by disabling that stupid signal :]

The problem is that the connection can be closed at any
time during an async write operation, or between the
notification there's space to write and the actual write
proceeding.

<flame>
IN FACT it can occur AFTER the client write is done, but
before the OS has transmitted the data .. which is in fact
exactly what happens when you close an asynchronous
socket (all the data which is CERTAINLY just put
in the buffer is lost due to a bug in POSIX).
</flame>

Actually I do not know WHY the connection is closed!
It happens using both Firefox (loading a page with
images, which are loaded in parallel), and also using
two concurrent instances of curl.. what ever firefox does,
curl will be doing something sane.

The design of sockets (and perhaps the underlying TCP/IP
protocol?) is poorly designed. IMHO ;)

What the webserver does is read the GET line and then
shutdown its read half of the socket. It is NOT ACCEPTABLE
to read the whole message, since this opens up the webserver
to a DNS attack. However it doesn't have to shutdown its reader
(the client's sender).

Then it sends to the client. In a robust server, this has to be time limited,
again to prevent a DNS attack.

Now it could be the shutdown, possibly before the whole message is read,
is fooling the client into believing its request isn't going to be serviced,
leading the client to shutdown *its* reader, which means the connection
is then dead.

It's also possible this doesn't happen on a single file request because
the "random" ordering of the shutdown? Not sure, but a sequence of
single requests always seems to succeed.. sometimes multiple requests
also appear to succeed.

Hmmm ..


--
john skaller
skal...@users.sourceforge.net





------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
Felix-language mailing list
Felix-language@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/felix-language

Reply via email to