Here’s an interesting bit I stumbled upon while playing with Amazon Web Services (AWS) Elastic Load Balancing (ELB): HTTP requests must have their lines terminated with CRLF and not just a line feed. When using netcat to test a web server by speaking HTTP, it only sends LFs by default (\n). While RFC 2616 specifies:
… a bare CR or LF MUST NOT be substituted for CRLF within any of the HTTP control structures …
Using netcat to connect to a web server typically works just fine. I’m inputting the HTTP requests by hand and [ENTER] is where I hit the enter key.
$ nc www.google.com 80 GET / HTTP/1.0[ENTER] [ENTER] HTTP/1.0 200 OK Date: Fri, 09 Apr 2010 20:07:25 GMT Expires: -1 [snip]
This works against Apache. However when connecting to an Apache server through ELB, one must run netcat with the -C option to send a CRLF instead of a lone LF upon return.
$ nc -C elb.example.org 80 GET / HTTP/1.0[ENTER] [ENTER] HTTP/1.1 302 Found Content-Type: text/html; charset=iso-8859-1 Date: Fri, 09 Apr 2010 20:09:39 GMT Location: http://elb.example.org/404/ Server: Apache Vary: Accept-Encoding Content-Length: 290 Connection: Close
Sans the -C option, the connection simply hangs. Which asks the question, what is Amazon doing with your HTTP traffic in between?