diff --git a/dist/antd-1.0.5b.tar.gz b/dist/antd-1.0.5b.tar.gz index 3d028a3..06c05b2 100644 Binary files a/dist/antd-1.0.5b.tar.gz and b/dist/antd-1.0.5b.tar.gz differ diff --git a/lib/handle.c b/lib/handle.c index e03836d..6d67d2e 100644 --- a/lib/handle.c +++ b/lib/handle.c @@ -24,208 +24,270 @@ #define HTML_TPL "%s

%s

" -static const char* S_100 = "Continue"; -static const char* S_101 = "Switching Protocols"; -static const char* S_102 = "Processing"; -static const char* S_103 = "Early Hints"; +static const char *S_100 = "Continue"; +static const char *S_101 = "Switching Protocols"; +static const char *S_102 = "Processing"; +static const char *S_103 = "Early Hints"; -static const char* S_200 = "OK"; -static const char* S_201 = "Created"; -static const char* S_202 = "Accepted"; -static const char* S_203 = "Non-Authoritative Information"; -static const char* S_204 = "No Content"; -static const char* S_205 = "Reset Content"; -static const char* S_206 = "Partial Content"; -static const char* S_207 = "Multi-Status"; -static const char* S_208 = "Already Reported"; -static const char* S_226 = "IM Used"; +static const char *S_200 = "OK"; +static const char *S_201 = "Created"; +static const char *S_202 = "Accepted"; +static const char *S_203 = "Non-Authoritative Information"; +static const char *S_204 = "No Content"; +static const char *S_205 = "Reset Content"; +static const char *S_206 = "Partial Content"; +static const char *S_207 = "Multi-Status"; +static const char *S_208 = "Already Reported"; +static const char *S_226 = "IM Used"; -static const char* S_300 = "Multiple Choices"; -static const char* S_301 = "Moved Permanently"; -static const char* S_302 = "Found"; -static const char* S_303 = "See Other"; -static const char* S_304 = "Not Modified"; -static const char* S_305 = "Use Proxy"; -static const char* S_306 = "Switch Proxy"; -static const char* S_307 = "Temporary Redirect"; -static const char* S_308 = "Permanent Redirect"; +static const char *S_300 = "Multiple Choices"; +static const char *S_301 = "Moved Permanently"; +static const char *S_302 = "Found"; +static const char *S_303 = "See Other"; +static const char *S_304 = "Not Modified"; +static const char *S_305 = "Use Proxy"; +static const char *S_306 = "Switch Proxy"; +static const char *S_307 = "Temporary Redirect"; +static const char *S_308 = "Permanent Redirect"; -static const char* S_400 = "Bad Request"; -static const char* S_401 = "Unauthorized"; -static const char* S_402 = "Payment Required"; -static const char* S_403 = "Forbidden"; -static const char* S_404 = "Not Found"; -static const char* S_405 = "Method Not Allowed"; -static const char* S_406 = "Not Acceptable"; -static const char* S_407 = "Proxy Authentication Required"; -static const char* S_408 = "Request Timeout"; -static const char* S_409 = "Conflict"; -static const char* S_410 = "Gone"; -static const char* S_411 = "Length Required"; -static const char* S_412 = "Precondition Failed"; -static const char* S_413 = "Payload Too Large"; -static const char* S_414 = "URI Too Long"; -static const char* S_415 = "Unsupported Media Type"; -static const char* S_416 = "Range Not Satisfiable"; -static const char* S_417 = "Expectation Failed"; -static const char* S_421 = "Misdirected Request"; -static const char* S_422 = "Unprocessable Entity"; -static const char* S_423 = "Locked"; -static const char* S_424 = "Failed Dependency"; -static const char* S_425 = "Too Early"; -static const char* S_426 = "Upgrade Required"; -static const char* S_428 = "Precondition Required"; -static const char* S_429 = "Too Many Requests"; -static const char* S_431 = "Request Header Fields Too Large"; -static const char* S_451 = "Unavailable For Legal Reasons"; +static const char *S_400 = "Bad Request"; +static const char *S_401 = "Unauthorized"; +static const char *S_402 = "Payment Required"; +static const char *S_403 = "Forbidden"; +static const char *S_404 = "Not Found"; +static const char *S_405 = "Method Not Allowed"; +static const char *S_406 = "Not Acceptable"; +static const char *S_407 = "Proxy Authentication Required"; +static const char *S_408 = "Request Timeout"; +static const char *S_409 = "Conflict"; +static const char *S_410 = "Gone"; +static const char *S_411 = "Length Required"; +static const char *S_412 = "Precondition Failed"; +static const char *S_413 = "Payload Too Large"; +static const char *S_414 = "URI Too Long"; +static const char *S_415 = "Unsupported Media Type"; +static const char *S_416 = "Range Not Satisfiable"; +static const char *S_417 = "Expectation Failed"; +static const char *S_421 = "Misdirected Request"; +static const char *S_422 = "Unprocessable Entity"; +static const char *S_423 = "Locked"; +static const char *S_424 = "Failed Dependency"; +static const char *S_425 = "Too Early"; +static const char *S_426 = "Upgrade Required"; +static const char *S_428 = "Precondition Required"; +static const char *S_429 = "Too Many Requests"; +static const char *S_431 = "Request Header Fields Too Large"; +static const char *S_451 = "Unavailable For Legal Reasons"; -static const char* S_500 = "Internal Server Error"; -static const char* S_501 = "Not Implemented"; -static const char* S_502 = "Bad Gateway"; -static const char* S_503 = "Service Unavailable"; -static const char* S_504 = "Gateway Timeout"; -static const char* S_505 = "HTTP Version Not Supported"; -static const char* S_506 = "Variant Also Negotiates"; -static const char* S_507 = "Insufficient Storage"; -static const char* S_508 = "Loop Detected"; -static const char* S_510 = "Not Extended"; -static const char* S_511 = "Network Authentication Required"; -static const char* S_UNOF = "Unofficial Status"; +static const char *S_500 = "Internal Server Error"; +static const char *S_501 = "Not Implemented"; +static const char *S_502 = "Bad Gateway"; +static const char *S_503 = "Service Unavailable"; +static const char *S_504 = "Gateway Timeout"; +static const char *S_505 = "HTTP Version Not Supported"; +static const char *S_506 = "Variant Also Negotiates"; +static const char *S_507 = "Insufficient Storage"; +static const char *S_508 = "Loop Detected"; +static const char *S_510 = "Not Extended"; +static const char *S_511 = "Network Authentication Required"; +static const char *S_UNOF = "Unofficial Status"; - -int require_plugin(const char* name) +int require_plugin(const char *name) { UNUSED(name); return 0; } -int compressable(char* ctype) +int compressable(char *ctype) { UNUSED(ctype); return 0; } -void htdocs(antd_request_t* rq, char* dest) +void htdocs(antd_request_t *rq, char *dest) { dictionary_t xheader = (dictionary_t)dvalue(rq->request, "REQUEST_HEADER"); - char* www = (char*)dvalue(xheader, "SERVER_WWW_ROOT"); - if(www) + char *www = (char *)dvalue(xheader, "SERVER_WWW_ROOT"); + if (www) { - strcpy(dest,www); + strcpy(dest, www); } } -void dbdir(char* dest) +void dbdir(char *dest) { UNUSED(dest); } -void tmpdir(char* dest) +void tmpdir(char *dest) { UNUSED(dest); } -void plugindir(char* dest) +void plugindir(char *dest) { UNUSED(dest); } -const char* get_status_str(int stat) +const char *get_status_str(int stat) { - switch(stat) + switch (stat) { - case 100: return S_100; - case 101: return S_101; - case 102: return S_102; - case 103: return S_103; + case 100: + return S_100; + case 101: + return S_101; + case 102: + return S_102; + case 103: + return S_103; - case 200: return S_200; - case 201: return S_201; - case 202: return S_202; - case 203: return S_203; - case 204: return S_204; - case 205: return S_205; - case 206: return S_206; - case 207: return S_207; - case 208: return S_208; - case 226: return S_226; + case 200: + return S_200; + case 201: + return S_201; + case 202: + return S_202; + case 203: + return S_203; + case 204: + return S_204; + case 205: + return S_205; + case 206: + return S_206; + case 207: + return S_207; + case 208: + return S_208; + case 226: + return S_226; - case 300: return S_300; - case 301: return S_301; - case 302: return S_302; - case 303: return S_303; - case 304: return S_304; - case 305: return S_305; - case 306: return S_306; - case 307: return S_307; - case 308: return S_308; + case 300: + return S_300; + case 301: + return S_301; + case 302: + return S_302; + case 303: + return S_303; + case 304: + return S_304; + case 305: + return S_305; + case 306: + return S_306; + case 307: + return S_307; + case 308: + return S_308; - case 400: return S_400; - case 401: return S_401; - case 402: return S_402; - case 403: return S_403; - case 404: return S_404; - case 405: return S_405; - case 406: return S_406; - case 407: return S_407; - case 408: return S_408; - case 409: return S_409; - case 410: return S_410; - case 411: return S_411; - case 412: return S_412; - case 413: return S_413; - case 414: return S_414; - case 415: return S_415; - case 416: return S_416; - case 417: return S_417; - case 421: return S_421; - case 422: return S_422; - case 423: return S_423; - case 424: return S_424; - case 425: return S_425; - case 426: return S_426; - case 428: return S_428; - case 429: return S_429; - case 431: return S_431; - case 451: return S_451; + case 400: + return S_400; + case 401: + return S_401; + case 402: + return S_402; + case 403: + return S_403; + case 404: + return S_404; + case 405: + return S_405; + case 406: + return S_406; + case 407: + return S_407; + case 408: + return S_408; + case 409: + return S_409; + case 410: + return S_410; + case 411: + return S_411; + case 412: + return S_412; + case 413: + return S_413; + case 414: + return S_414; + case 415: + return S_415; + case 416: + return S_416; + case 417: + return S_417; + case 421: + return S_421; + case 422: + return S_422; + case 423: + return S_423; + case 424: + return S_424; + case 425: + return S_425; + case 426: + return S_426; + case 428: + return S_428; + case 429: + return S_429; + case 431: + return S_431; + case 451: + return S_451; - case 500: return S_500; - case 501: return S_501; - case 502: return S_502; - case 503: return S_503; - case 504: return S_504; - case 505: return S_505; - case 506: return S_506; - case 507: return S_507; - case 508: return S_508; - case 510: return S_510; - case 511: return S_511; - default: return S_UNOF; + case 500: + return S_500; + case 501: + return S_501; + case 502: + return S_502; + case 503: + return S_503; + case 504: + return S_504; + case 505: + return S_505; + case 506: + return S_506; + case 507: + return S_507; + case 508: + return S_508; + case 510: + return S_510; + case 511: + return S_511; + default: + return S_UNOF; } } -void antd_send_header(void* cl, antd_response_header_t* res) +void antd_send_header(void *cl, antd_response_header_t *res) { - if(!res->header) + if (!res->header) res->header = dict(); - antd_client_t* client = (antd_client_t*) cl; + antd_client_t *client = (antd_client_t *)cl; #ifdef USE_ZLIB antd_compress_t current_zlevel = client->z_level; - char* str = dvalue(res->header,"Content-Encoding"); - if(!str) - { + char *str = dvalue(res->header, "Content-Encoding"); + if (!str) + { // check for compress - str = dvalue(res->header,"Content-Type"); - if(str) + str = dvalue(res->header, "Content-Type"); + if (str) { - if(compressable(str) && client->z_level != ANTD_CNONE) + if (compressable(str) && client->z_level != ANTD_CNONE) { - client->zstream = (z_stream *) malloc(sizeof(z_stream)); - if(client->zstream) + client->zstream = (z_stream *)malloc(sizeof(z_stream)); + if (client->zstream) { - ((z_stream*)client->zstream)->zalloc = Z_NULL; - ((z_stream*)client->zstream)->zfree = Z_NULL; - ((z_stream*)client->zstream)->opaque = Z_NULL; - if(client->z_level == ANTD_CGZ) + ((z_stream *)client->zstream)->zalloc = Z_NULL; + ((z_stream *)client->zstream)->zfree = Z_NULL; + ((z_stream *)client->zstream)->opaque = Z_NULL; + if (client->z_level == ANTD_CGZ) { - if(deflateInit2(client->zstream,Z_BEST_COMPRESSION,Z_DEFLATED,15 | 16, 8,Z_DEFAULT_STRATEGY) != Z_OK) + if (deflateInit2(client->zstream, Z_BEST_COMPRESSION, Z_DEFLATED, 15 | 16, 8, Z_DEFAULT_STRATEGY) != Z_OK) { ERROR("Cannot init gzip stream"); free(client->zstream); @@ -234,12 +296,12 @@ void antd_send_header(void* cl, antd_response_header_t* res) else { client->status = Z_NO_FLUSH; - dput(res->header,"Content-Encoding", strdup("gzip")); + dput(res->header, "Content-Encoding", strdup("gzip")); } } else { - if(deflateInit(client->zstream, Z_BEST_COMPRESSION) != Z_OK) + if (deflateInit(client->zstream, Z_BEST_COMPRESSION) != Z_OK) { ERROR("Cannot init deflate stream"); free(client->zstream); @@ -248,38 +310,38 @@ void antd_send_header(void* cl, antd_response_header_t* res) else { client->status = Z_NO_FLUSH; - dput(res->header,"Content-Encoding", strdup("deflate")); + dput(res->header, "Content-Encoding", strdup("deflate")); } } } } } } - client->z_level = ANTD_CNONE; + client->z_level = ANTD_CNONE; #endif - dput(res->header,"Server", strdup(SERVER_NAME)); - const char* stat_str = get_status_str(res->status); + dput(res->header, "Server", strdup(SERVER_NAME)); + const char *stat_str = get_status_str(res->status); __t(client, "HTTP/1.1 %d %s", res->status, stat_str); chain_t it; for_each_assoc(it, res->header) { - __t(client,"%s: %s", it->key, (const char*)it->value); + __t(client, "%s: %s", it->key, (const char *)it->value); } // send out cookie - if(res->cookie) + if (res->cookie) { item_t el; list_for_each(el, res->cookie) { - if(el->type == LIST_TYPE_POINTER && el->value.ptr) + if (el->type == LIST_TYPE_POINTER && el->value.ptr) { - __t(client,"Set-Cookie: %s", (char*)el->value.ptr); + __t(client, "Set-Cookie: %s", (char *)el->value.ptr); } } list_free(&res->cookie); res->cookie = NULL; } - __b(client, (unsigned char*)"\r\n", 2); + __b(client, (unsigned char *)"\r\n", 2); #ifdef USE_ZLIB client->z_level = current_zlevel; #endif @@ -297,24 +359,23 @@ void octstream(void* client, char* name) //Content-Disposition: attachment; filename="fname.ext" }*/ - -int antd_send(void *src, const void* data_in, int len_in) +int antd_send(void *src, const void *data_in, int len_in) { - uint8_t* data = (uint8_t*)data_in; + uint8_t *data = (uint8_t *)data_in; int len = len_in; - antd_client_t * source = (antd_client_t *) src; - if(!src || !data) - { + antd_client_t *source = (antd_client_t *)src; + if (!src || !data) + { return -1; } - + #ifdef USE_ZLIB - if(source->zstream && source->z_level != ANTD_CNONE) + if (source->zstream && source->z_level != ANTD_CNONE) { antd_compress_t current_zlevel = source->z_level; source->z_level = ANTD_CNONE; uint8_t buf[BUFFLEN]; - z_stream* zstream = (z_stream*) source->zstream; + z_stream *zstream = (z_stream *)source->zstream; zstream->avail_in = (uInt)len; zstream->next_in = (Bytef *)data_in; len = 0; @@ -323,7 +384,7 @@ int antd_send(void *src, const void* data_in, int len_in) { zstream->avail_out = BUFFLEN; zstream->next_out = buf; - if(deflate(zstream, source->status) == Z_STREAM_ERROR) + if (deflate(zstream, source->status) == Z_STREAM_ERROR) { source->z_level = current_zlevel; data = NULL; @@ -335,139 +396,139 @@ int antd_send(void *src, const void* data_in, int len_in) antd_send(source, buf, have); len += have; } - } while(zstream->avail_out == 0); + } while (zstream->avail_out == 0); source->z_level = current_zlevel; return len; } #endif int written; - char* ptr; + char *ptr; int writelen = 0; - int count; + int count; #ifdef USE_OPENSSL - if(source->ssl) + if (source->ssl) { //LOG("SSL WRITE\n"); //ret = SSL_write((SSL*) source->ssl, data, len); - ptr = (char* )data; - writelen = len > BUFFLEN?BUFFLEN:len; + ptr = (char *)data; + writelen = len > BUFFLEN ? BUFFLEN : len; written = 0; fd_set fds; - struct timeval timeout; + struct timeval timeout; while (writelen > 0) //source->attempt < MAX_ATTEMPT - { + { // clear the error queue ERR_clear_error(); - count = SSL_write (source->ssl, ptr+written, writelen); + count = SSL_write(source->ssl, ptr + written, writelen); int err = SSL_get_error(source->ssl, count); - if (count > 0) - { - written += count; - writelen = (len - written) > BUFFLEN?BUFFLEN:(len-written); + if (count > 0) + { + written += count; + writelen = (len - written) > BUFFLEN ? BUFFLEN : (len - written); time(&source->last_io); - } - else - { - if(difftime( time(NULL), source->last_io) > MAX_IO_WAIT_TIME) + } + else + { + if (difftime(time(NULL), source->last_io) > MAX_IO_WAIT_TIME) { - if(written == 0) + if (written == 0) written = count; break; } - //printf(" received equal to or less than 0\n") - switch (err) - { - case SSL_ERROR_NONE: - { - // no real error, just try again... - //LOG("SSL_ERROR_NONE \n"); + //printf(" received equal to or less than 0\n") + switch (err) + { + case SSL_ERROR_NONE: + { + // no real error, just try again... + //LOG("SSL_ERROR_NONE \n"); + //source->attempt++; + continue; + } + + case SSL_ERROR_ZERO_RETURN: + { + // peer disconnected... + // ERROR("SSLWRITE: SSL_ERROR_ZERO_RETURN: peer disconected: %d", source->sock); + break; + } + + case SSL_ERROR_WANT_READ: + { + // no data available right now, wait a few seconds in case new data arrives... + //printf("SSL_ERROR_WANT_READ\n"); + + int sock = SSL_get_rfd(source->ssl); + FD_ZERO(&fds); + FD_SET(sock, &fds); + + timeout.tv_sec = 0; + timeout.tv_usec = 500; + err = select(sock + 1, &fds, NULL, NULL, &timeout); + if (err == 0 || (err > 0 && FD_ISSET(sock, &fds))) + { //source->attempt++; - continue; - } + continue; // more data to read... + } + //ERROR("SSL WRITE: want read but select error on the socket %d: %s", source->sock, strerror(errno)); + break; + } - case SSL_ERROR_ZERO_RETURN: - { - // peer disconnected... - // ERROR("SSLWRITE: SSL_ERROR_ZERO_RETURN: peer disconected: %d", source->sock); - break; - } + case SSL_ERROR_WANT_WRITE: + { + // socket not writable right now, wait a few seconds and try again... + //printf("SSL_ERROR_WANT_WRITE \n"); + int sock = SSL_get_wfd(source->ssl); + FD_ZERO(&fds); + FD_SET(sock, &fds); - case SSL_ERROR_WANT_READ: - { - // no data available right now, wait a few seconds in case new data arrives... - //printf("SSL_ERROR_WANT_READ\n"); + timeout.tv_sec = 0; + timeout.tv_usec = 500; - int sock = SSL_get_rfd(source->ssl); - FD_ZERO(&fds); - FD_SET(sock, &fds); + err = select(sock + 1, NULL, &fds, NULL, &timeout); + if (err == 0 || (err > 0 && FD_ISSET(sock, &fds))) + { + //source->attempt++; + continue; // can write more data now... + } + //ERROR("SSL WRITE: want write but select error on the socket %d: %s", source->sock, strerror(errno)); + break; + } - timeout.tv_sec = 0; - timeout.tv_usec = 500; - err = select(sock+1, &fds, NULL, NULL, &timeout); - if (err == 0 || (err > 0 && FD_ISSET(sock, &fds))) - { - //source->attempt++; - continue; // more data to read... - } - //ERROR("SSL WRITE: want read but select error on the socket %d: %s", source->sock, strerror(errno)); - break; - } - - case SSL_ERROR_WANT_WRITE: - { - // socket not writable right now, wait a few seconds and try again... - //printf("SSL_ERROR_WANT_WRITE \n"); - int sock = SSL_get_wfd(source->ssl); - FD_ZERO(&fds); - FD_SET(sock, &fds); - - timeout.tv_sec = 0; - timeout.tv_usec = 500; - - err = select(sock+1, NULL, &fds, NULL, &timeout); - if (err == 0 || (err > 0 && FD_ISSET(sock, &fds))) - { - //source->attempt++; - continue; // can write more data now... - } - //ERROR("SSL WRITE: want write but select error on the socket %d: %s", source->sock, strerror(errno)); - break; - } - - default: - { - // other error - //ERROR("SSL WRITE: Unknown error on %d: %s", source->sock, ERR_error_string(ERR_get_error(), NULL) ); - break; - } - } - if(written == 0) + default: + { + // other error + //ERROR("SSL WRITE: Unknown error on %d: %s", source->sock, ERR_error_string(ERR_get_error(), NULL) ); + break; + } + } + if (written == 0) written = count; break; - } + } } //source->attempt = 0; } else { #endif - ptr = (char* )data; - writelen = len > BUFFLEN?BUFFLEN:len; + ptr = (char *)data; + writelen = len > BUFFLEN ? BUFFLEN : len; written = 0; while (writelen > 0) - { - count = send(source->sock, ptr+written, writelen, 0); - if (count > 0) - { - written += count; - writelen = (len - written) > BUFFLEN?BUFFLEN:(len-written); - time(&source->last_io); - } - else if(difftime( time(NULL), source->last_io) > MAX_IO_WAIT_TIME || (count == -1 && errno != EAGAIN && errno != EWOULDBLOCK)) + { + count = send(source->sock, ptr + written, writelen, 0); + if (count > 0) { - if(written == 0) + written += count; + writelen = (len - written) > BUFFLEN ? BUFFLEN : (len - written); + time(&source->last_io); + } + else if (difftime(time(NULL), source->last_io) > MAX_IO_WAIT_TIME || (count == -1 && errno != EAGAIN && errno != EWOULDBLOCK)) + { + if (written == 0) written = count; //ERROR("Error while writing: %s", strerror(errno)); break; @@ -477,117 +538,118 @@ int antd_send(void *src, const void* data_in, int len_in) #ifdef USE_OPENSSL } #endif - + return written; } -int antd_recv(void *src, void* data, int len) +int antd_recv(void *src, void *data, int len) { - if(!src) return -1; - int read=0; - char* ptr = NULL; - int received=0; - int readlen=0; - antd_client_t * source = (antd_client_t *) src; + if (!src) + return -1; + int read = 0; + char *ptr = NULL; + int received = 0; + int readlen = 0; + antd_client_t *source = (antd_client_t *)src; #ifdef USE_OPENSSL - if(source->ssl) + if (source->ssl) { - ptr = (char* )data; - readlen = len > BUFFLEN?BUFFLEN:len; + ptr = (char *)data; + readlen = len > BUFFLEN ? BUFFLEN : len; read = 0; fd_set fds; - struct timeval timeout; - while (readlen > 0 )//&& source->attempt < MAX_ATTEMPT - { + struct timeval timeout; + while (readlen > 0) //&& source->attempt < MAX_ATTEMPT + { ERR_clear_error(); - received = SSL_read (source->ssl, ptr+read, readlen); + received = SSL_read(source->ssl, ptr + read, readlen); int err = SSL_get_error(source->ssl, received); - if (received > 0) - { - read += received; - readlen = (len - read) > BUFFLEN?BUFFLEN:(len-read); + if (received > 0) + { + read += received; + readlen = (len - read) > BUFFLEN ? BUFFLEN : (len - read); time(&source->last_io); - } - else - { + } + else + { // Timeout, quit - if(difftime( time(NULL), source->last_io) > MAX_IO_WAIT_TIME) + if (difftime(time(NULL), source->last_io) > MAX_IO_WAIT_TIME) { - if(read == 0) + if (read == 0) read = received; break; } - //printf(" received equal to or less than 0\n") - switch (err) - { - case SSL_ERROR_NONE: - { - // no real error, just try again... - //LOG("SSL_ERROR_NONE \n"); + //printf(" received equal to or less than 0\n") + switch (err) + { + case SSL_ERROR_NONE: + { + // no real error, just try again... + //LOG("SSL_ERROR_NONE \n"); + //source->attempt++; + continue; + } + + case SSL_ERROR_ZERO_RETURN: + { + // peer disconnected... + //ERROR("SSL READ: SSL_ERROR_ZERO_RETURN, peer disconnected %d", source->sock); + break; + } + + case SSL_ERROR_WANT_READ: + { + // no data available right now, wait a few seconds in case new data arrives... + //printf("SSL_ERROR_WANT_READ\n"); + + int sock = SSL_get_rfd(source->ssl); + FD_ZERO(&fds); + FD_SET(sock, &fds); + + timeout.tv_sec = 0; + timeout.tv_usec = 500; + err = select(sock + 1, &fds, NULL, NULL, &timeout); + if (err == 0 || (err > 0 && FD_ISSET(sock, &fds))) + { //source->attempt++; - continue; - } + continue; // more data to read... + } + //ERROR("SSL READ: want read but select error on the socket %d: %s", source->sock, strerror(errno)); + break; + } - case SSL_ERROR_ZERO_RETURN: - { - // peer disconnected... - //ERROR("SSL READ: SSL_ERROR_ZERO_RETURN, peer disconnected %d", source->sock); - break; - } + case SSL_ERROR_WANT_WRITE: + { + // socket not writable right now, wait a few seconds and try again... + //printf("SSL_ERROR_WANT_WRITE \n"); + int sock = SSL_get_wfd(source->ssl); + FD_ZERO(&fds); + FD_SET(sock, &fds); - case SSL_ERROR_WANT_READ: - { - // no data available right now, wait a few seconds in case new data arrives... - //printf("SSL_ERROR_WANT_READ\n"); + timeout.tv_sec = 0; + timeout.tv_usec = 500; - int sock = SSL_get_rfd(source->ssl); - FD_ZERO(&fds); - FD_SET(sock, &fds); + err = select(sock + 1, NULL, &fds, NULL, &timeout); + if (err == 0 || (err > 0 && FD_ISSET(sock, &fds))) + { + //source->attempt++; + continue; // can write more data now... + } + //ERROR("SSL READ: want write but select error on the socket %d: %s", source->sock, strerror(errno)); + break; + } - timeout.tv_sec = 0; - timeout.tv_usec = 500; - err = select(sock+1, &fds, NULL, NULL, &timeout); - if (err == 0 || (err > 0 && FD_ISSET(sock, &fds))) - { - //source->attempt++; - continue; // more data to read... - } - //ERROR("SSL READ: want read but select error on the socket %d: %s", source->sock, strerror(errno)); - break; - } - - case SSL_ERROR_WANT_WRITE: - { - // socket not writable right now, wait a few seconds and try again... - //printf("SSL_ERROR_WANT_WRITE \n"); - int sock = SSL_get_wfd(source->ssl); - FD_ZERO(&fds); - FD_SET(sock, &fds); - - timeout.tv_sec = 0; - timeout.tv_usec = 500; - - err = select(sock+1, NULL, &fds, NULL, &timeout); - if (err == 0 || (err > 0 && FD_ISSET(sock, &fds))) - { - //source->attempt++; - continue; // can write more data now... - } - //ERROR("SSL READ: want write but select error on the socket %d: %s", source->sock, strerror(errno)); - break; - } - - default: - { - // other error - //ERROR("SSL READ: unkown error on %d: %s", source->sock, ERR_error_string(ERR_get_error(), NULL)); - break; - } - } - if(read == 0) + default: + { + // other error + //ERROR("SSL READ: unkown error on %d: %s", source->sock, ERR_error_string(ERR_get_error(), NULL)); + break; + } + } + if (read == 0) read = received; - break; - } - } + break; + } + } //source->attempt = 0; /* int stat, r, st; @@ -611,24 +673,24 @@ int antd_recv(void *src, void* data, int len) else { #endif - ptr = (char* )data; - readlen = len > BUFFLEN?BUFFLEN:len; + ptr = (char *)data; + readlen = len > BUFFLEN ? BUFFLEN : len; read = 0; - while (readlen > 0 ) - { - received = recv(((int) source->sock), ptr+read, readlen, 0); + while (readlen > 0) + { + received = recv(((int)source->sock), ptr + read, readlen, 0); //LOG("Read : %c\n", *ptr); - if (received > 0) - { - read += received; - readlen = (len - read) > BUFFLEN?BUFFLEN:(len-read); + if (received > 0) + { + read += received; + readlen = (len - read) > BUFFLEN ? BUFFLEN : (len - read); time(&source->last_io); //LOG("Read len is %d\n", readlen); - } - else if( difftime( time(NULL), source->last_io) > MAX_IO_WAIT_TIME || (errno != EAGAIN && errno != EWOULDBLOCK)) + } + else if (difftime(time(NULL), source->last_io) > MAX_IO_WAIT_TIME || (errno != EAGAIN && errno != EWOULDBLOCK)) { //ERROR("Error while reading: %s", strerror(errno)); - if(read ==0) + if (read == 0) read = received; break; } @@ -644,11 +706,12 @@ int antd_recv(void *src, void* data, int len) }*/ return read; } -void set_nonblock(int socket) { - int flags; - flags = fcntl(socket,F_GETFL,0); - //assert(flags != -1); - fcntl(socket, F_SETFL, flags | O_NONBLOCK); +void set_nonblock(int socket) +{ + int flags; + flags = fcntl(socket, F_GETFL, 0); + //assert(flags != -1); + fcntl(socket, F_SETFL, flags | O_NONBLOCK); } /*void set_block() { @@ -657,15 +720,16 @@ void set_nonblock(int socket) { //assert(flags != -1); fcntl(socket, F_SETFL, flags & (~O_NONBLOCK)); }*/ -int antd_close(void* src) +int antd_close(void *src) { - if(!src) return -1; - antd_client_t * source = (antd_client_t *) src; + if (!src) + return -1; + antd_client_t *source = (antd_client_t *)src; #ifdef USE_ZLIB //TODO: send finish data to the socket before quit - if(source->zstream) + if (source->zstream) { - if(source->status == Z_NO_FLUSH && source->z_level != ANTD_CNONE) + if (source->status == Z_NO_FLUSH && source->z_level != ANTD_CNONE) { source->status = Z_FINISH; antd_send(source, "", 0); @@ -677,13 +741,14 @@ int antd_close(void* src) } #endif #ifdef USE_OPENSSL - if(source->ssl){ + if (source->ssl) + { //printf("SSL:Shutdown ssl\n"); - //SSL_shutdown((SSL*) source->ssl); - SSL_set_shutdown((SSL*) source->ssl, SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); + //SSL_shutdown((SSL*) source->ssl); + SSL_set_shutdown((SSL *)source->ssl, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); //printf("SSL:Free ssl\n"); - SSL_free((SSL*) source->ssl); - + SSL_free((SSL *)source->ssl); + //EVP_cleanup(); //ENGINE_cleanup(); CRYPTO_cleanup_all_ex_data(); @@ -700,35 +765,35 @@ int antd_close(void* src) return ret; } -int __t(void* client, const char* fstring,...) +int __t(void *client, const char *fstring, ...) { int dlen; int st; - va_list arguments; - char * data; - va_start( arguments, fstring); - dlen = vsnprintf(0,0,fstring,arguments)+1; - va_end(arguments); - if ((data = (char*)malloc(dlen*sizeof(char))) != 0) - { - va_start(arguments, fstring); - vsnprintf(data, dlen, fstring, arguments); - va_end(arguments); - st = __b(client, (const unsigned char*)data, strlen(data)); - if(st) - __b(client, (unsigned char*)"\r\n", 2); - free(data); + va_list arguments; + char *data; + va_start(arguments, fstring); + dlen = vsnprintf(0, 0, fstring, arguments) + 1; + va_end(arguments); + if ((data = (char *)malloc(dlen * sizeof(char))) != 0) + { + va_start(arguments, fstring); + vsnprintf(data, dlen, fstring, arguments); + va_end(arguments); + st = __b(client, (const unsigned char *)data, strlen(data)); + if (st) + __b(client, (unsigned char *)"\r\n", 2); + free(data); return st; - } + } return 0; // } -int __b(void* client, const unsigned char* data, int size) +int __b(void *client, const unsigned char *data, int size) { int sent = 0; int buflen = 0; int nbytes = 0; - char* ptr = (char*)data; + char *ptr = (char *)data; /*if(size <= BUFFLEN) { nbytes = antd_send(client,data,size); @@ -736,44 +801,45 @@ int __b(void* client, const unsigned char* data, int size) } else {*/ - while(sent < size) + while (sent < size) + { + if (size - sent > BUFFLEN) + buflen = BUFFLEN; + else + buflen = size - sent; + nbytes = antd_send(client, ptr, buflen); + if (nbytes == -1) { - if(size - sent > BUFFLEN) - buflen = BUFFLEN; - else - buflen = size - sent; - nbytes = antd_send(client,ptr,buflen); - if(nbytes == -1) - { - return 0; - } - sent += buflen; - ptr += buflen; - } + return 0; + } + sent += buflen; + ptr += buflen; + } //} return 1; } -int __f(void* client, const char* file) +int __f(void *client, const char *file) { unsigned char buffer[BUFFLEN]; FILE *ptr; - ptr = fopen(file,"rb"); - if(!ptr) + ptr = fopen(file, "rb"); + if (!ptr) { LOG("Cannot read : %s", file); return 0; } size_t size; - while(!feof(ptr)) + while (!feof(ptr)) { - size = fread(buffer,1,BUFFLEN,ptr); - if(antd_send(client,buffer,size) == -1) return 0; + size = fread(buffer, 1, BUFFLEN, ptr); + if (antd_send(client, buffer, size) == -1) + return 0; } fclose(ptr); return 1; } -int upload(const char* tmp, const char* path) +int upload(const char *tmp, const char *path) { return !rename(tmp, path); } @@ -801,43 +867,44 @@ void clear_cookie(void* client, dictionary_t dic) } */ -void antd_error(void* client, int status, const char* msg) +void antd_error(void *client, int status, const char *msg) { antd_response_header_t rsh; rsh.header = dict(); rsh.cookie = NULL; - const char* stat_str = get_status_str(status); + const char *stat_str = get_status_str(status); rsh.status = status; - char* ctype = "text/html; charset=utf-8"; + char *ctype = "text/html; charset=utf-8"; dput(rsh.header, "Content-Type", strdup(ctype)); - char * res_str = __s(HTML_TPL, stat_str, msg); + char *res_str = __s(HTML_TPL, stat_str, msg); int clen = 0; - if(res_str) + if (res_str) { clen = strlen(res_str); } char ibuf[20]; - snprintf (ibuf, sizeof(ibuf), "%d",clen); + snprintf(ibuf, sizeof(ibuf), "%d", clen); #ifdef USE_ZLIB - if(((antd_client_t*)client)->z_level == ANTD_CNONE || !compressable(ctype)) + if (((antd_client_t *)client)->z_level == ANTD_CNONE || !compressable(ctype)) #endif dput(rsh.header, "Content-Length", strdup(ibuf)); antd_send_header(client, &rsh); - if(res_str) + if (res_str) { //printf("%s\n", res_str); - __b(client, (unsigned char*)res_str, clen); + __b(client, (unsigned char *)res_str, clen); //__t(client, HTML_TPL, stat_str, msg); free(res_str); } } - int ws_enable(dictionary_t dic) { - if(!dic) return 0; - char*v = (char*)dvalue(dic, "__web_socket__"); - if(!v) return 0; + if (!dic) + return 0; + char *v = (char *)dvalue(dic, "__web_socket__"); + if (!v) + return 0; return atoi(v) == 1; } @@ -850,7 +917,7 @@ int ws_enable(dictionary_t dic) * @param size size of buffer * @return number of bytes read */ -int read_buf(void* sock, char*buf,int size) +int read_buf(void *sock, char *buf, int size) { int i = 0; char c = '\0'; diff --git a/lib/scheduler.c b/lib/scheduler.c index 9afe821..b4af579 100644 --- a/lib/scheduler.c +++ b/lib/scheduler.c @@ -269,7 +269,6 @@ void antd_execute_task(antd_scheduler_t* scheduler, antd_task_item_t taski) if(!taski) return; // execute the task - LOG("Execute task with priority: %d", taski->task->priority); void *ret = (*(taski->task->handle))(taski->task->data); // check the return data if it is a new task if(!ret)