/*bucket ctx*/ struct chunk_ctx * chunk_ctx_alloc(struct mpool * pool) { struct chunk_ctx *ctx = cpo_pool_malloc(pool, sizeof(struct chunk_ctx)); if (ctx == NULL) return NULL; ctx->b = NULL; ctx->size = 0; return ctx; }
chunks_t *chunks_alloc(struct mpool * pool) { chunks_t *c = cpo_pool_malloc(pool, sizeof(chunks_t)); if (!c) return NULL; c->total_bytes = 0; c->list = NULL; c->pool = pool; return c; }
int calipso_resource_set_stat(calipso_resource_t *resource, void *sb) { if(resource->resource_stat == NULL) { resource->resource_stat = cpo_pool_malloc(resource->pool, sizeof(struct stat)); } *(struct stat *)resource->resource_stat = *(struct stat *)sb; return (1); }
int chunk_ctx_append(struct mpool * pool, struct chunk_ctx *ctx, const char *data, int size) { /* just make room for data */ char * newbuf = cpo_pool_malloc(pool, ctx->size + size + 1); if (newbuf) { memmove(newbuf, ctx->b, ctx->size); memmove(newbuf + ctx->size, data, size + 1); ctx->b = newbuf; ctx->size += size; return size; } return 0; }
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_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; }