/* Log a CGI error. */ void log_cgi_error(t_session *session, char *mesg) { FILE *fp; char *c, str[TIMESTAMP_SIZE + IP_ADDRESS_SIZE]; int len = 0; if ((session->host->error_logfile == NULL) || (mesg == NULL)) { return; } c = mesg; while (*c != '\0') { if (*c == '\n') { if (*(c + 1) == '\0') { *c = '\0'; } else { *c = '|'; } } else { len++; } c++; } if (len == 0) { return; } if ((fp = fopen(session->host->error_logfile, "a")) == NULL) { return; } if (session->config->anonymize_ip) { anonymized_ip_to_str(&(session->ip_address), str, IP_ADDRESS_SIZE); } else { ip_to_str(&(session->ip_address), str, IP_ADDRESS_SIZE); } strcat(str, "|"); print_timestamp(str + strlen(str)); if (session->file_on_disk == NULL) { fprintf(fp, "%s-|%s"EOL, str, secure_string(mesg)); } else { fprintf(fp, "%s%s|%s"EOL, str, session->file_on_disk, secure_string(mesg)); } fclose(fp); }
/* Log an error for a specific file */ void log_file_error(t_session *session, char *file, char *mesg, ...) { FILE *fp; va_list args; char str[TIMESTAMP_SIZE + IP_ADDRESS_SIZE + 2]; if (mesg == NULL) { return; } if (session->host == NULL) { if (session->config->first_host->error_logfile == NULL) { return; } fp = fopen(session->config->first_host->error_logfile, "a"); } else { if (session->host->error_logfile == NULL) { return; } fp = fopen(session->host->error_logfile, "a"); } if (fp == NULL) { return; } va_start(args, mesg); if (session->config->anonymize_ip) { anonymized_ip_to_str(&(session->ip_address), str, IP_ADDRESS_SIZE); } else { ip_to_str(&(session->ip_address), str, IP_ADDRESS_SIZE); } strcat(str, "|"); print_timestamp(str + strlen(str)); if (file == NULL) { fprintf(fp, "%s", str); } else { fprintf(fp, "%s%s|", str, file); } vfprintf(fp, mesg, args); fprintf(fp, EOL); fclose(fp); va_end(args); }
/* Log a HTTP request. */ void log_request(t_session *session) { char str[BUFFER_SIZE + 1], timestamp[TIMESTAMP_SIZE], ip_address[IP_ADDRESS_SIZE]; char *user, *field, *uri, *vars, *path_info; t_http_header *http_header; int offset; time_t t; struct tm s; if (ip_allowed(&(session->ip_address), session->config->logfile_mask) == deny) { return; } str[BUFFER_SIZE] = '\0'; #ifdef ENABLE_TOOLKIT if (session->request_uri == NULL) { #endif uri = secure_string(session->uri); path_info = secure_string(session->path_info); vars = secure_string(session->vars); #ifdef ENABLE_TOOLKIT } else { uri = secure_string(session->request_uri); path_info = NULL; vars = NULL; } #endif if ((user = session->remote_user) != NULL) { user = secure_string(user); } if (session->config->log_format == hiawatha) { /* Hiawatha log format */ if (session->config->anonymize_ip) { anonymized_ip_to_str(str, &(session->ip_address), IP_ADDRESS_SIZE); } else { ip_to_str(str, &(session->ip_address), IP_ADDRESS_SIZE); } strcat(str, "|"); offset = strlen(str); print_timestamp(str + offset); offset += strlen(str + offset); if (user == NULL) { user = ""; } snprintf(str + offset, BUFFER_SIZE - offset, "%d|%lld|%s|%s %s", session->return_code, (long long)session->bytes_sent, user, secure_string(session->method), uri); offset += strlen(str + offset); if ((offset < BUFFER_SIZE) && (path_info != NULL)) { snprintf(str + offset, BUFFER_SIZE - offset, "/%s", path_info); offset += strlen(str + offset); } if ((offset < BUFFER_SIZE) && (vars != NULL)) { snprintf(str + offset, BUFFER_SIZE - offset, "?%s", vars); offset += strlen(str + offset); } if (offset < BUFFER_SIZE) { snprintf(str + offset, BUFFER_SIZE - offset, " %s", secure_string(session->http_version)); offset += strlen(str + offset); } if (offset < BUFFER_SIZE) { http_header = session->http_headers; while (http_header != NULL) { if ((strncasecmp("Cookie:", http_header->data, 7) != 0) && (strncasecmp("Authorization:", http_header->data, 14) != 0)) { snprintf(str + offset, BUFFER_SIZE - offset, "|%s", secure_string(http_header->data)); if ((offset += strlen(str + offset)) >= BUFFER_SIZE) { break; } } http_header = http_header->next; } } } else { /* Common Log Format */ if (session->config->anonymize_ip) { anonymized_ip_to_str(ip_address, &(session->ip_address), IP_ADDRESS_SIZE); } else { ip_to_str(ip_address, &(session->ip_address), IP_ADDRESS_SIZE); } if (user == NULL) { user = "******"; } time(&t); localtime_r(&t, &s); timestamp[TIMESTAMP_SIZE - 1] = '\0'; strftime(timestamp, TIMESTAMP_SIZE - 1, "%d/%b/%Y:%T %z", &s); snprintf(str, BUFFER_SIZE, "%s - %s [%s] \"%s %s", ip_address, user, timestamp, secure_string(session->method), uri); offset = strlen(str); if ((offset < BUFFER_SIZE) && (path_info != NULL)) { snprintf(str + offset, BUFFER_SIZE - offset, "/%s", path_info); offset += strlen(str + offset); } if ((offset < BUFFER_SIZE) && (vars != NULL)) { snprintf(str + offset, BUFFER_SIZE - offset, "?%s", vars); offset += strlen(str + offset); } if (offset < BUFFER_SIZE) { snprintf(str + offset, BUFFER_SIZE - offset, " %s\" %d %lld", secure_string(session->http_version), session->return_code, (long long)session->bytes_sent); } if (session->config->log_format == extended) { /* Extended Common Log Format */ offset += strlen(str + offset); if (offset < BUFFER_SIZE) { if ((field = get_http_header("Referer:", session->http_headers)) != NULL) { snprintf(str + offset, BUFFER_SIZE - offset, " \"%s\"", secure_string(field)); } else { snprintf(str + offset, BUFFER_SIZE - offset, " \"-\""); } offset += strlen(str + offset); } if (offset < BUFFER_SIZE) { if ((field = get_http_header("User-Agent:", session->http_headers)) != NULL) { snprintf(str + offset, BUFFER_SIZE - offset, " \"%s\"", secure_string(field)); } else { snprintf(str + offset, BUFFER_SIZE - offset, " \"-\""); } } } } pthread_mutex_lock(&accesslog_mutex); if (*(session->host->access_fp) == NULL) { *(session->host->access_fp) = fopen(session->host->access_logfile, "a"); } if (*(session->host->access_fp) != NULL) { fprintf(*(session->host->access_fp), "%s"EOL, str); fflush(*(session->host->access_fp)); } pthread_mutex_unlock(&accesslog_mutex); }