Я разрабатываю модуль Apache, в котором мне нужно прочитать все тело запроса, чтобы сосчитать все содержащиеся в нем байты.
Я мог бы использовать заголовок «Content-Length», но пока онотправленные на стороне клиента данные, я не доверяю этим данным.
Я обнаружил, что этот код читает тело и возвращает длину тела:
static size_t get_post_body_length(request_record *request, char **buffer) {
int rc;
if ((rc = ap_setup_client_block(request, REQUEST_CHUNKED_ERROR)) != OK) {
return rc;
}
size_t rpos = 0;
if (ap_should_client_block(request)) {
int len_read;
while ((len_read = ap_get_client_block(request, *buffer, 4096)) > 0) {
rpos += len_read;
}
}
return rpos;
}
Фактически, после запросатело было прочитано, у меня есть длина тела, но указатель перемещен, и тело теперь пусто, но char **buffer
содержит содержимое тела.Я пытался повторно внедрить этот буфер в теле запроса, но я не могу понять, как.
Я не хочу, чтобы он был пустым, так как запрос POST должен быть перенаправлен без изменений.
Я обнаружил некоторые поля в структуре данных request_rec, которые могли бы содержать количество байтов, но все они равны 0, поскольку тело никогда не читалось apache.
Я также пытался изменить ap_get_client_block()
функция из исходного кода Apache https, чтобы попытаться имитировать эту функцию, чтобы не потерять указатель, но также не работает.
Как я могу прочитать это тело и сохранить его в моем request_rec?Или переустановить это?