Intereting Posts
c ++: проблема открытия ifstream с передачей строки для имени текстового файла Что делает это использование указателей непредсказуемым? OpenSSL в соединении Socket Socket (клиент HTTPS) Выполните различные методы, основанные на типе переменной шаблона Qt Сигналы и безопасность прорези параметр шаблона указателя непигового типа Eclipse c ++ Как работать с существующим make-файлом SendInput отправляет «num8», когда я хочу отправить «vk_up»? Как так? Создание приложения OpenCV с помощью Visual Studio 2008 и запуск его с другого компьютера получить индекс элемента std :: vector, учитывая его адрес Ручка QSlider скрывается при смене фона паза Литье большого числа типов в меньший тип Перенаправление данных из MFC CArchive в boost :: archive :: xml_oarchive Почему моя программа иногда возникает из-за нехватки памяти, а не бросает std :: bad_alloc? c ++ для чтения неизвестного размера csv-файла (заполненного только поплавками) с постоянным (но неизвестным) числом столбцов в массив

Обработка запроса POST с помощью libmicrohttpd

Я должен использовать libmicrohttpd для настройки сервера REST. Нет проблем с запросом GET, но я не понимаю, что я делаю неправильно, чтобы обрабатывать запрос POST (PUT на самом деле) (формат JSON). Вот код:

int MHD_answer_to_connection (void* cls, struct MHD_Connection* connection, const char* url, const char* method, const char* version, const char* upload_data, size_t* upload_data_size, void** con_cls) { // Initializes parser/camera/settings... static Parser parser; // The first time only the headers are valid, do not respond in the first round static int dummy; if (*con_cls != &dummy) { *con_cls = &dummy; return MHD_YES; } // Parse URL to get the resource int resource = parser.getRequestedResource(url); // Check wether if it's a GET or a POST method if(strcmp(method, MHD_HTTP_METHOD_GET) == 0) { parser.processGetRequest(resource); } else { parser.processPutRequest(upload_data, *upload_data_size); } // Building HTTP response (headers+data) MHD_Response* httpResponse = parser.getResponse(); int ret = MHD_queue_response (connection, MHD_HTTP_OK, httpResponse); if (ret != MHD_YES) { Logger::get().error("Error queuing message"); } MHD_destroy_response (httpResponse); // Clear context pointer *con_cls = NULL; return ret; } 

Каждый раз, когда я пытаюсь отправить запрос PUT с некоторыми данными, я получаю сообщение «Внутренняя ошибка приложения, закрывающее соединение». Проблема может исходить из одной из следующих вещей:

  • ответ на публикацию / отсутствие сообщений при первом вызове fucntion

  • изменяя или не добавляя * upload_data_size (чтобы указать, что обработка выполнена)

  • хорошее расположение команды *con_cls = NULL

Спасибо!

Я столкнулся с этой проблемой и обнаружил решение с помощью некоторой отладки.

Когда библиотека вызывает ваш обработчик с помощью request_data , вы не можете ставить в очередь любые ответы ( MHD_queue_response возвращает MHD_NO ). Вам нужно подождать, пока последний обработчик не вызовет MHD_queue_response request_data чтобы вызвать MHD_queue_response .

Насколько я могу судить по этому поведению.

Я также использую GNU libmicrohttpd , и я нашел простую демонстрацию POST в своем репозитории .

Демонстрационная версия немного проста: у нее есть форма, которая запрашивает ваше имя, поэтому, когда вы вводите свое имя и нажимаете кнопку «Отправить», опубликованные данные обрабатываются в функции answer_to_connection() :

 static int answer_to_connection (void *cls, struct MHD_Connection *connection, const char *url, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **con_cls) { ... if (0 == strcmp (method, "POST")) { struct connection_info_struct *con_info = *con_cls; if (*upload_data_size != 0) { MHD_post_process (con_info->postprocessor, upload_data, *upload_data_size); *upload_data_size = 0; return MHD_YES; } else if (NULL != con_info->answerstring) return send_page (connection, con_info->answerstring); } ...