Exemple #1
0
void generate_error_page(av_req_data_t * data, ci_request_t * req)
{
     int new_size = 0;
     ci_membuf_t *error_page;
     char buf[128];

     snprintf(buf, 128, "X-Infection-Found: Type=0; Resolution=2; Threat=%s;",
              data->virus_name);
     buf[127] = '\0';
     ci_icap_add_xheader(req, buf);
     new_size =
         strlen(clamav_error_message) + strlen(clamav_tail_message) +
         strlen(data->virus_name) + 10;
     if ( ci_http_response_headers(req))
          ci_http_response_reset_headers(req);
     else
          ci_http_response_create(req, 1, 1);
     ci_http_response_add_header(req, "HTTP/1.0 403 Forbidden");
     ci_http_response_add_header(req, "Server: C-ICAP");
     ci_http_response_add_header(req, "Connection: close");
     ci_http_response_add_header(req, "Content-Type: text/html");
     ci_http_response_add_header(req, "Content-Language: en");


     error_page = ci_membuf_new_sized(new_size);
     ((av_req_data_t *) data)->error_page = error_page;

     ci_membuf_write(error_page, (char *) clamav_error_message,
                     strlen(clamav_error_message), 0);
     ci_membuf_write(error_page, (char *) data->virus_name,
                     strlen(data->virus_name), 0);
     ci_membuf_write(error_page, (char *) clamav_tail_message, strlen(clamav_tail_message), 1); /*And here is the eof.... */
}
//TODO: 全く同じheaderを持っている場合はこの関数を実行しない
int replace_headers(ci_request_t *req) {
	const int REQ_TYPE = ci_req_type(req);
	const char * (*addHeader)(ci_request_t *,const char *) = NULL;
	//RESPMODとREQMODの違いによって、関数ポインタを変えることで、同じ処理を2度書かなくてすむ。
	if (REQ_TYPE == ICAP_REQMOD) {
		ci_http_request_reset_headers(req);//TODO: Error management
		addHeader = ci_http_request_add_header;
	}else if (REQ_TYPE == ICAP_RESPMOD) {
		ci_http_response_reset_headers(req);//TODO: Error management
		addHeader = ci_http_response_add_header;
	} else {
		goto replace_headers_ignore;
	}

	PyObject * pInstance = (PyObject *)ci_service_data(req);//Don't decref
	PyObject * pList = PyObject_GetAttrString(pInstance,PYCI_CLASS_LIST_HEADERS);//DECREF ME

	if (pList && PyList_Check(pList)) {
		PyObject * pHeader;
		char * header;
		int i,pList_size;
		pList_size = PyList_Size(pList);//E+ TODO: size check
		for (i=0; i < pList_size ; i++) {
			pHeader = PyList_GetItem(pList,i);//E+ Don't DECREF
			if (pHeader && PyString_Check(pHeader)) {
				header = PyString_AsString(pHeader);//E+ Don't free me. TODO: size check
				addHeader(req, header);//TODO: Error check
			} else {
				pyci_debug_printf(PYCI_MESSAGE_LEVEL, "http headers replacing must be string. ignoring...");
				goto replace_headers_ignore;
			}
		}
	}
replace_headers_ignore:
	Py_XDECREF(pList);
	return 0;
}