/* http protocol */ static int mod_http_set_keepalive(calipso_request_t *request) { const char * conn; calipso_reply_t *reply; calipso_client_t *client; client = calipso_request_get_client(request); reply = calipso_request_get_reply(request); client->keepalive = NOK; conn = calipso_request_get_header_value(request, "connection"); if(conn != NULL && !strcasecmp(conn,"keep-alive")) { /*limit keep alives*/ int max; client->keepalives++; max = client->server->keep_alive_max - client->keepalives; if(max > 0) { client->keepalive = OK; if(USE_HEADER_HTTP_KEEPALIVE_TIMEMAX) { calipso_reply_set_header_value(reply, "Keep-Alive", "timeout=%d, max=%d", KEEPALIVE_TIMEOUT, max); } } } calipso_reply_set_header_value(reply, "Connection", client->keepalive ? "Keep-Alive" : "Close"); return OK; }
int calipso_request_parse_header_buf(calipso_request_t *request) { calipso_client_t *client = calipso_request_get_client(request); if (!client->done) { char *eol; char *requestbuf = request->header_buf->b; eol = strstr(requestbuf, EOLCR); if (eol == NULL) eol = strstr(requestbuf, EOL); if (eol == NULL) request_parse_status_line(request, requestbuf); else { if (*eol == '\r') { *eol = *(eol + 1) = 0; eol += 2; } else *eol++ = 0; request_parse_status_line(request, requestbuf); request_parse_header(request, eol); request_set_header_vals(request); } } if (request->body_length == request->in_filter->total_bytes) { /* Request hook call */ calipso_trigger_hook(HOOK_REQUEST, request); calipso_trigger_hook(HOOK_TRANSLATE, request); calipso_trigger_hook(HOOK_RESOURCE, request); calipso_trigger_hook(HOOK_ACCESS_CHECK, request); calipso_trigger_hook(HOOK_MIME, request); calipso_trigger_hook(HOOK_REPLY, request); } return CPO_OK; }
static int mod_http_translate(calipso_request_t *request) { char *pathname = NULL; char *uri = NULL; char *documentroot = NULL; calipso_client_t *client = calipso_request_get_client(request); calipso_server_t *server = calipso_client_get_server(client); calipso_reply_t *reply = calipso_request_get_reply(request); calipso_resource_t *resource = calipso_reply_get_resource(reply); calipso_pool_t *pool = calipso_request_get_pool(request); int http_status = calipso_reply_get_status(reply); if ( calipso_http_status_is_error(http_status)) { TRACE(" http error %d\n", http_status); return (0); } if( remove_dots_from_uri_path(request->uri) == -1 ) { calipso_reply_set_status(reply, HTTP_BAD_REQUEST); return 0; } if (!cpo_uri_sanity_check( request->uri )) { calipso_reply_set_status(reply, HTTP_BAD_REQUEST); return 0; } uri = calipso_request_get_uri(request); //if (*uri != '/') { // calipso_reply_set_status(reply, HTTP_BAD_REQUEST); // return (0); //} documentroot = calipso_server_get_documentroot(server); if (!documentroot) { calipso_reply_set_status(reply, HTTP_BAD_REQUEST); return (0); } pathname = cpo_pool_malloc(pool, MAXPATHLEN); strlcpy(pathname, documentroot, MAXPATHLEN); cpo_uri_strdecode(uri, uri); if (strlcat(pathname, uri, MAXPATHLEN) >= MAXPATHLEN) { calipso_reply_set_status(reply, HTTP_REQUEST_URI_TOO_LARGE); return (0); } /* security chek */ //if (!cpo_uri_sanity_check( pathname )) { // calipso_reply_set_status(reply, HTTP_BAD_REQUEST); // return 0; //} /* decode string */ //cpo_uri_strdecode(pathname, pathname); calipso_resource_set_path(resource, pathname); return 1; }