FeoTweet v0.2.0
Now available here! https://deno.land/x/feotweet@v0.2.0
It adds support for syncing a single user's tweets to FeoBlog, as well as copying tweet attachments into FeoBlog.
Developing in Deno is still pretty fun. Though I did spend a couple days scratching my head due to this bug.
Apparently HTTP clients don't do well when you close the HTTP connection when they're still sending bytes at you, even if you've already sent a response.
The HTTP 1.1 spec isn't super clear on what should happen in this case. For example, it says this about closing connections, but seems to imply it's only for idle connections:
A client, server, or proxy MAY close the transport connection at any time. For example, a client might have started to send a new request at the same time that the server has decided to close the "idle" connection. From the server's point of view, the connection is being closed while it was idle, but from the client's point of view, a request is in progress.
This means that clients, servers, and proxies MUST be able to recover from asynchronous close events.
And it says this about "Client Behavior if Server Prematurely Closes Connection":
If at any point an error status is received, the client
SHOULD NOT continue and
SHOULD close the connection if it has not completed sending the request message.
... but that's only in the case of an "error" status, not an OK status.
Chrome handled this case by ... pausing for about 5 seconds, then continuing without error. (!?) And Deno handled this case by ... well, in the case I reproduced in that bug report, the next call to fetch()
would fail, but during debugging I saw other sorts of odd failures. Like calling .read()
on a Deno.Reader
that seemed completely unrelated to the HTTP connection would fail and say the rid
(Deno "resource ID") was invalid. Yeah, that one had me confused for a while. I wasn't able to reproduce that one in a minimal example, though.
I was able to work around the issue by just waiting for all the bytes to be sent before sending an HTTP response. But this seems like a thing that people could use to DoS your server. If you try to be nice and read all these unnecessary bytes they sent to you they can just do it forever. Though I guess there are countless other ways to DoS an HTTP server in addition to this, so what's one more?