Как получить доступ к телу запроса POST с использованием приложения fastcgi C/С++

Я использую библиотеку из http://fastcgi.com/ в приложении С++ в качестве бэкэнд и веб-сервера nginx в качестве интерфейса.

Проводка файлов из HTML-формы успешно и может видеть временные файлы на стороне сервера nginx. Но я не могу понять, как получить доступ к телу multipart POST-запроса, используя fastcgi_stdio. Это моя HTML-форма.

<html>
    <head>
        <title>Test Server</title>
        <script src="http://code.jquery.com/jquery.min.js"></script>
    </head>
    <body>
        <form id="upload-form" method="post" target="upload_target"   enctype="multipart/form-data" action="/upload">
            <input name="file" id="file" size="27" type="file" /><br />
            <input type="submit" name="action" value="Upload" /><br />
            <iframe id="upload_target" name="upload_target" src="" style="width:100%;height:100px;border:0px solid #fff;"></iframe>
        </form>
    </body>
</html>

My nginx conf файл:

location /upload {

# Pass altered request body to this location
upload_pass @test;

# Store files to this directory
# The directory is hashed, subdirectories 0 1 2 3 4 5 6 7 8 9 should exist
upload_store /www/test;

# Allow uploaded files to be read only by user
upload_store_access user:rw group:r all:r;

# Set specified fields in request body
upload_set_form_field $upload_field_name.name $upload_file_name;
upload_set_form_field $upload_field_name.content_type "$upload_content_type";
upload_set_form_field $upload_field_name.path "$upload_tmp_path";

# Inform backend about hash and size of a file
upload_aggregate_form_field "$upload_field_name.md5" "$upload_file_md5";
upload_aggregate_form_field "$upload_field_name.size" "$upload_file_size";

upload_pass_form_field "^submit$|^description$";
upload_cleanup 400 404 499 500-505;
}

include fastcgi.conf;

# Pass altered request body to a backend
location @test {
        fastcgi_pass  localhost:8080
}

Теперь, как можно обработать/получить тело запроса POST в моем приложении fastcgi С++ и как записать его в надлежащем файле на стороне приложения fastcgi?

Есть ли лучший быстрый модуль для достижения этого?

Спасибо.

Ответ 1

Вы можете получить доступ к телу POST через поток FCGI_stdin. Например, вы можете читать из него один байт за раз, используя FCGI_getchar, который является короткой формой для FCGI_fgetc(FCGI_stdin). Вы можете читать большие куски данных за один раз, используя FCGI_fread. Все это я нашел, глядя на источник. Эти источники часто ссылаются на то, что называется "H & S" - это означает "Харбисон и Стил", авторы книги C: Справочное руководство, а числа относятся к главам и разделам этой книги.

И, кстати, он называется "stdio" для "STanDard Input/Output". Не "студия". Функции должны в основном вести себя как их коллеги без префикса FCGI_. Поэтому для подробностей посмотрите man-страницы getchar, fread и т.д.

Как только у вас есть байты в приложении, вы можете записать их в файл, используя обычные операции stdio или файлы, открытые через FCGI_fopen. Однако обратите внимание, что входной поток не будет напрямую соответствовать содержимому загруженного файла. Вместо этого MIME-кодирование используется для передачи всех данных формы, включая файлы. Вы должны будете проанализировать этот поток, если хотите получить доступ к данным файла.

Ответ 2

Используйте это:

char * method = getenv("REQUEST_METHOD");
if (!strcmp(method, "POST")) {
    int ilen = atoi(getenv("CONTENT_LENGTH"));
    char *bufp = malloc(ilen);
    fread(bufp, ilen, 1, stdin);
    printf("The POST data is<P>%s\n", bufp);
    free(bufp);
}