2017-01-03 2 views
0

Недавно я начал использовать AWS C++ SDK с некоторым успехом. Те звонки, которые основаны на HTTPS GET, работают нормально. Для IoT REST API я могу создать Things и ListThings.Вызов UpdateThing возвращает 504 Тайм-аут шлюза при использовании AWS C++ SDK

Однако, когда я вызываю запрос UpdateThing, зависает вызов и время ожидания. Я получаю ошибку тайм-аута шлюза AWS 504.

Я пробовал несколько вещей, но безрезультатно. Кажется, что несколько опубликованных примеров помогают мне расшифровать проблему.

Выход журнала DEBUG AWS здесь:

[DEBUG] 2017-01-03 22:08:42 AWSClient [0x7fff755d1000] Request Successfully signed 
[DEBUG] 2017-01-03 22:08:42 CurlHandleContainer [0x7fff755d1000] Attempting to acquire curl connection. 
[DEBUG] 2017-01-03 22:08:42 CurlHandleContainer [0x7fff755d1000] No current connections available in pool. Attempting to create new connections. 
[DEBUG] 2017-01-03 22:08:42 CurlHandleContainer [0x7fff755d1000] attempting to grow pool size by 2 
[INFO] 2017-01-03 22:08:42 CurlHandleContainer [0x7fff755d1000] Pool successfully grown by 2 
[INFO] 2017-01-03 22:08:42 CurlHandleContainer [0x7fff755d1000] Connection has been released. Continuing. 
[DEBUG] 2017-01-03 22:08:42 CurlHandleContainer [0x7fff755d1000] Returning connection handle 0x7f90bc00da00 
[DEBUG] 2017-01-03 22:08:42 CurlHttpClient [0x7fff755d1000] Obtained connection handle 0x7f90bc00da00 
[DEBUG] 2017-01-03 22:09:42 CurlHttpClient [0x7fff755d1000] Returned http response code 504 
[DEBUG] 2017-01-03 22:09:42 CurlHttpClient [0x7fff755d1000] Releasing curl handle 0x7f90bc00da00 
[DEBUG] 2017-01-03 22:09:42 CurlHandleContainer [0x7fff755d1000] Releasing curl handle 0x7f90bc00da00 
[DEBUG] 2017-01-03 22:09:42 CurlHandleContainer [0x7fff755d1000] Notified waiting threads. 
[DEBUG] 2017-01-03 22:09:42 AWSClient [0x7fff755d1000] Request returned error. Attempting to generate appropriate error codes from response 
[ERROR] 2017-01-03 22:09:42 AWSClient [0x7fff755d1000] No response body. Response code: 504 

Код:

Aws::IoT::Model::UpdateThingRequest request; 
Aws::IoT::Model::AttributePayload payload; 

payload.AddAttributes("manufacturer",manufacturer); 
payload.AddAttributes("product",product); 
payload.AddAttributes("type",type); 
payload.SetMerge(true); 

request 
    .WithThingName(name) 
    .WithAttributePayload(payload); 

auto outcome = _client->UpdateThing(request); 

if (outcome.IsSuccess()) { 
    log.info("Sucess"); 
} else { 
    log.info("Error: %s: %s",outcome.GetError().GetExceptionName().c_str(), 
      outcome.GetError().GetMessage().c_str()); 
} 
+0

Отсутствие реакции тела? Это кажется неожиданным. Интересно, если это поддельный код ошибки, локально сгенерированный ... –

+0

Я считаю, что отсутствие тела ответа связано с таймаутом. Мне нужно более внимательно изучить, как взаимодействие POST реализовано в SDK. –

+0

На самом деле похоже, что это связано с тем, как библиотека обрабатывает вызовы PATCH для отдыха. Метод POST работает нормально. Кажется, что до службы AWS REST ожидают тело PATCH, и он не отправляется клиентом. –

ответ

1

Мой вопрос, казалось, таким образом, что ротор Mac OS X библиотека (7.52.1) было обрабатывая запрос PATCH. По умолчанию он не вызывал зарегистрированную функцию данных (зарегистрированную через CURLOPT_READFUNCTION).

Я решил это, установив файл CurlHttpClient.cpp, чтобы добавить параметр CURLOPT_POST для запроса PATCH.

https://github.com/aws/aws-sdk-cpp/pull/401

Смежные вопросы