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; }
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; }