예제 #1
0
파일: request.c 프로젝트: rkarpuzov/calipso
int calipso_request_init_handler(calipso_client_t * client)
{
    cpo_event_t *event = client->event;

    calipso_request_t *request = calipso_request_alloc();

    if (request) {
        request->reply = calipso_reply_alloc();
        calipso_reply_init(request->reply);
    } else
        return CPO_ERR;

    if (request->reply)
        request->reply->request = request;
    else
        return CPO_ERR;

    event->handler_read = (void*)calipso_request_event_read_handler;
    event->handler_write = (void*)calipso_request_event_write_handler;

    request->header = hash_table_create(MAX_HASH_REQUEST_HEADER, NULL);

    calipso_request_set_method(request, NULL);
    calipso_request_set_uri(request, "/");
    calipso_request_set_version(request, "HTTP/1.1");

    calipso_request_set_querystring(request, NULL);
    calipso_request_set_handler(request, NULL);

    client->client_persistent_hdl = request_persistent_handler;
    calipso_request_set_client(request, client);

    /* header head and body */
    request->header_buf = chunk_ctx_alloc(request->pool);
    request->in_filter = chunks_alloc(request->pool);

    if (request->header_buf) {
        request->header_buf->b = cpo_pool_malloc(request->pool, INPUTBUFSZ);
    }

    /*XXX: pipelining ? */
    //!calipso_client_pipeline_request(client, request);
    calipso_client_set_request(client, request);

    return CPO_OK;
}
예제 #2
0
파일: mod_http.c 프로젝트: nask0/calipso
static int mod_http_resource(calipso_request_t *request)
{
    int fd;
    struct stat sb;
	char date[32];
	
    calipso_reply_t *reply = calipso_request_get_reply(request);
    calipso_resource_t *resource = calipso_reply_get_resource(reply);
    const char *filename = calipso_resource_get_path(resource);
	int http_status  = calipso_reply_get_status(reply);
	
	/* Set the default handler */
    calipso_request_set_handler(request, mod_http_reply);

	if (calipso_http_status_is_error(http_status)) {
		TRACE(" http error %d\n", http_status);
		return (0);
	}
	//XXX: IsHandler AddHandelr ...
	if ( is_file_of(filename, ".php") ) {
		return (0);
	}

	/* check method */
    if (strcasecmp(request->method, "GET")  != 0 &&
            strcasecmp(request->method, "HEAD") != 0) {
        calipso_reply_set_status(reply, HTTP_NOT_IMPLEMENTED);
        return (NOK);
    }
	/* stat the resource for other modules to know what type it is */
#ifdef _WIN32
	remove_trailing_slash(filename);
#endif
	if (stat(filename, &sb) < 0) {
	
        //TRACE("ERROR: %s %s\n", strerror(errno), filename);

        switch (errno) {
        case ENOTDIR:
        case ENOENT:
            calipso_reply_set_status(reply, HTTP_NOT_FOUND);
            break;
        case EACCES:
            calipso_reply_set_status(reply, HTTP_FORBIDDEN);
            break;
        case ENAMETOOLONG:
            calipso_reply_set_status(reply, HTTP_REQUEST_URI_TOO_LARGE);
            break;
        default:
            calipso_reply_set_status(reply, HTTP_INTERNAL_SERVER_ERROR);
        }

        return CPO_OK;
    }

    calipso_resource_set_stat(resource, &sb);

	cpo_http_time(date, &sb.st_mtime);
	
	/* modified_since */
	if(USE_HEADER_MODFIED_SINCE && 
		CPO_OK == mod_http_set_if_modified_since(request, date))
		return OK;
	
    if (! calipso_resource_is_file(resource)) {

        /* default state mod_directory override */
		if(!calipso_http_status_is_error(http_status)) {
        	calipso_reply_set_status(reply, HTTP_FORBIDDEN);
		}
        return CPO_OK;
    }

	/*XXX: fcache needed */
	fd = cpo_file_open(filename, 0);

	if(fd < 0 ){
		calipso_reply_set_status(reply, HTTP_INTERNAL_SERVER_ERROR);
		return CPO_ERR;
	}

	calipso_reply_set_header_value(reply, "Accept-Ranges", "bytes");

	if (!calipso_reply_get_header_value(reply, "content-range"))
		reply->content_length = calipso_resource_get_size(resource);
    	//calipso_reply_set_header_value(reply, "Content-Length", "%llu",
        //                               calipso_resource_get_size(resource));

	calipso_reply_set_header_value(reply, "Last-Modified", date);

    calipso_resource_set_file_descriptor(resource, fd);

	mod_http_partial_content(request, fd);

    return CPO_OK;
}