#include <stdbool.h>
#include <inttypes.h>
#include <string.h>
+#include <strings.h>
#include <errno.h>
#include <signal.h>
return 0;
}
+static char *strcasestr( const char *haystack, const char *needle ) {
+ size_t l = strlen( needle );
+ for ( char *p = (char *)haystack; *p; ++p )
+ if ( strncasecmp( p, needle, l ) == 0 )
+ return p;
+ return NULL;
+}
+
static size_t copy_field_val( char *buf, size_t bufsz, const char *needle, const char *haystack, const char *def ) {
const char *s;
size_t l;
- if ( NULL != ( s = strstr( haystack, needle ) ) ) {
+ if ( NULL != ( s = strcasestr( haystack, needle ) ) ) {
const char *e;
s += strlen( needle );
if ( NULL != ( e = strstr( s, "\r\n" ) ) )
char hdr[512];
char origin[256];
char host[256];
+ char conn[32];
enum respond_code {
r_index,
r_json,
code = r_none;
copy_field_val( host, sizeof host, "Host: ", req, cfg.host );
+ copy_field_val( conn, sizeof conn, "Connection: ", req, "keep-alive" );
switch (code) {
case r_json: {
"Host: %s\r\n"
"Access-Control-Allow-Origin: %s\r\n"
"Content-type: text/json\r\n"
- "Connection: keep-alive\r\n"
+ "Connection: %s\r\n"
"Content-Length: %zu\r\n"
"\r\n",
host,
origin,
+ conn,
jsz
);
if ( 0 < n && (size_t)n < sizeof hdr && n == sockwrite( sock, hdr, n ) )
goto SEND_404;
if ( 0 > fstat(fi, &st) ) {
close( fi );
- goto SEND_404;
+ goto SEND_500;
}
n = snprintf( hdr, sizeof hdr,
"HTTP/1.1 200 OK\r\n"
"Host: %s\r\n"
"Content-type: text/html\r\n"
- "Connection: keep-alive\r\n"
+ "Connection: %s\r\n"
"Content-Length: %jd\r\n"
"\r\n",
host,
+ conn,
(intmax_t)st.st_size
);
if ( 0 < n && (size_t)n < sizeof hdr && n == sockwrite( sock, hdr, n ) ) {
sockwrite( sock, hdr, n );
break;
}
+ if ( 0 < ret && 0 != strcasecmp( conn, "keep-alive" ) )
+ ret = 0;
return ret;
}
static int rcv_request(int sock, char *buf, size_t size, int timeout) {
int res = -1;
+ char junk, *eohdr;
size_t total = 0;
ssize_t bread = 0;
--size;
break;
}
total += bread;
- timeout = 5;
+ timeout = 1;
}
+ while ( 1 == read_tm( sock, &junk, 1, 0 ) )
+ ;
buf[total] = 0;
- if ( strstr( buf, "\r\n\r\n" ) )
+ eohdr = strstr( buf, "\r\n\r\n" );
+ if ( NULL != eohdr ) {
+ eohdr[4] = '\0';
res = 0;
+ }
return res;
}
DPRINT( "sock: %d\n", td->sock );
while ( 0 == rcv_request(td->sock, req, sizeof req, 5000) ) {
DPRINT( "request:\n%s", req);
- if ( 0 > respond( td->sock, req ) )
+ if ( 0 >= respond( td->sock, req ) )
break;
}
net_close( td->sock );