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