Пример #1
0
/* 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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}