warmcat/libwebsockets — pull request #146 by andrew-canaday (2014-07-13 05:38:06+00:00)
Title: HTTP Version, Keep-alive support, No-copy POST

## Details:
This is a squashed commit from https://github.com/andrew-canaday/libwebsockets,
*dev/http_keepalive* branch (strategies changed a few times, so the commit
history is clutteread). This branch is submitted for clarity, but the other
can be used as a reference or alternative. A summary follows.

### private-libwebsockets:
* added **enum http_version** to track HTTP/1.0 vs HTTP/1.1 requests
* added **enum http_connection_type** to track keep-alive vs close
* replaced *content_length_seen* and *body_index* with **content_remain**
* removed **post_buffer** (see handshake.c modifications)

### libwebsockets.c: libwebsocket_close_and_free_session
* removed post_buffer free

### parsers.c: libwebsocket_parse
* switch state to WSI_TOKEN_SKIPPING after URI is complete to store version
* delete *spill* label (unused)

### server.c: lws_handshake_server
* add vars to track HTTP version and connection type
* HTTP version defaults to 1.0
* connection type defaults to 'close' for 1.0, keep-alive for 1.1
* additional checks in **cleanup:** label:
* if HTTP version string is present and valid, set enum val appropriately
* override connection default with the "Connection:" header, if present
* set state to WSI_STATE_HTTP_BODY if content_length > 0
* return 0 on HTTP requests, unless LWS_CALLBACK_HTTP indicates otherwise

### handshake.c:
* add vars to track remaining content_length and body chunk size
* re-arrange switch case order to facilitate creation of jump-table
* added new labels:
* **read_ok**: normal location reach on break from switch; just return 0
* **http_complete**: check for keep-alive + init state, mode, hdr table
* **http_new**: jump location for keep-alive when http_complete sees len>0
* after libwebsocket_parse, jump to one of those labels based on state
* POST body handling:
* don't bother iterating over input byte-by-byte or using memcpy
* just pass the relevant portion of the context->service_buffer to callback