/* 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; }
static int request_set_header_vals(calipso_request_t *request) { char *host = calipso_request_get_header_value(request, "host"); char *clen = calipso_request_get_header_value(request, "content-length"); if (host) { char * p = strrchr(host, ':'); request->host = (p) ? cpo_pool_strndup(request->pool, host, p - host) : cpo_pool_strdup( request->pool, host); } if (clen) { request->body_length = cpo_atoi(clen); } /*XXX: transfer-coding */ return CPO_OK; }
static int mod_http_set_if_modified_since(calipso_request_t *request, const char *http_date) { const char *modified_since = calipso_request_get_header_value(request, "if-modified-since"); if(modified_since && !strcmp(http_date , modified_since)) { calipso_reply_set_status(request->reply, HTTP_NOT_MODIFIED); return OK; } return NOK; }
static int mod_http_partial_content(calipso_request_t *request, int fd) { /* HTTP_PARTIAL_CONTENT */ char *range; char *type; char *offset1; char *offset2; uintmax_t total_size; uintmax_t partial_size; range = calipso_request_get_header_value(request, "range"); if (range) { calipso_reply_set_status(request->reply, HTTP_PARTIAL_CONTENT); type = offset1 = offset2 = NULL; http_range_tokenize(range, &type, &offset1 , &offset2); TRACE("RANGE: %s\n", range); TRACE("type: %s offset1: %s offset2: %s \n", type, offset1, offset2); total_size = calipso_resource_get_size(request->reply->resource); partial_size = total_size - atol(offset1); TRACE("partial size: %llu ? total size %llu\n", partial_size, total_size); calipso_reply_set_header_value(request->reply, "content-range", "bytes=%s-%llu/%llu", offset1, total_size - 1, total_size); calipso_reply_set_header_value(request->reply, "Content-Length", "%llu", partial_size); /*set fd position */ (off_t)lseek(fd, (off_t)atoi(offset1), SEEK_SET); } /* !HTTP_PARTIAL_CONTENT*/ return OK; }