@@ -43,7 +43,7 @@ using namespace avsCommon::utils::power;
4343const static std::string AVS_EVENT_URL_PATH_EXTENSION = " /v20160207/events" ;
4444
4545// / Boundary for mime encoded requests
46- const static std::string MIME_BOUNDARY = " WhooHooZeerOoonie! " ;
46+ const static std::string MIME_BOUNDARY = " WhooHooZeerOoonie= " ;
4747
4848// / Timeout for transmission of data on a given stream
4949static const std::chrono::seconds STREAM_PROGRESS_TIMEOUT = std::chrono::seconds(15 );
@@ -200,7 +200,8 @@ MessageRequestHandler::MessageRequestHandler(
200200 m_wasMessageRequestAcknowledgeReported{false },
201201 m_wasMessageRequestFinishedReported{false },
202202 m_responseCode{0 },
203- m_powerResource{powerResource} {
203+ m_powerResource{powerResource},
204+ m_resultStatus{MessageRequestObserverInterface::Status::PENDING} {
204205 ACSDK_DEBUG7 (LX (__func__).d (" context" , context.get ()).d (" messageRequest" , messageRequest.get ()));
205206
206207 if (m_powerResource) {
@@ -324,15 +325,37 @@ void MessageRequestHandler::onActivity() {
324325bool MessageRequestHandler::onReceiveResponseCode (long responseCode) {
325326 ACSDK_DEBUG7 (LX (__func__).d (" responseCode" , responseCode));
326327
327- // TODO ACSDK-1839: Provide MessageRequestObserverInterface immediate notification of receipt of response code.
328-
329328 reportMessageRequestAcknowledged ();
330329
331330 if (HTTPResponseCode::CLIENT_ERROR_FORBIDDEN == intToHTTPResponseCode (responseCode)) {
332331 m_context->onForbidden (m_authToken);
333332 }
334333
335334 m_responseCode = responseCode;
335+
336+ // Map HTTPResponseCode values to MessageRequestObserverInterface::Status values.
337+ static const std::unordered_map<long , MessageRequestObserverInterface::Status> responseToResult = {
338+ {HTTPResponseCode::HTTP_RESPONSE_CODE_UNDEFINED, MessageRequestObserverInterface::Status::INTERNAL_ERROR},
339+ {HTTPResponseCode::SUCCESS_OK, MessageRequestObserverInterface::Status::SUCCESS},
340+ {HTTPResponseCode::SUCCESS_ACCEPTED, MessageRequestObserverInterface::Status::SUCCESS_ACCEPTED},
341+ {HTTPResponseCode::SUCCESS_NO_CONTENT, MessageRequestObserverInterface::Status::SUCCESS_NO_CONTENT},
342+ {HTTPResponseCode::CLIENT_ERROR_BAD_REQUEST, MessageRequestObserverInterface::Status::BAD_REQUEST},
343+ {HTTPResponseCode::CLIENT_ERROR_FORBIDDEN, MessageRequestObserverInterface::Status::INVALID_AUTH},
344+ {HTTPResponseCode::CLIENT_ERROR_THROTTLING_EXCEPTION, MessageRequestObserverInterface::Status::THROTTLED},
345+ {HTTPResponseCode::SERVER_ERROR_INTERNAL, MessageRequestObserverInterface::Status::SERVER_INTERNAL_ERROR_V2},
346+ {HTTPResponseCode::SERVER_UNAVAILABLE, MessageRequestObserverInterface::Status::REFUSED}};
347+
348+ auto responseIterator = responseToResult.find (m_responseCode);
349+ if (responseIterator != responseToResult.end ()) {
350+ m_resultStatus = responseIterator->second ;
351+ } else {
352+ m_resultStatus = MessageRequestObserverInterface::Status::SERVER_OTHER_ERROR;
353+ }
354+
355+ ACSDK_DEBUG7 (LX (" responseCodeTranslated" ).d (" responseStatus" , m_resultStatus));
356+
357+ m_messageRequest->responseStatusReceived (m_resultStatus);
358+
336359 return true ;
337360}
338361
@@ -350,51 +373,35 @@ void MessageRequestHandler::onResponseFinished(HTTP2ResponseFinishedStatus statu
350373 m_messageRequest->exceptionReceived (nonMimeBody);
351374 }
352375
353- // Hash to allow use of HTTP2ResponseFinishedStatus as the key in an unordered_map.
354- struct statusHash {
355- size_t operator ()(const HTTP2ResponseFinishedStatus& key) const {
356- return static_cast <size_t >(key);
357- }
358- };
359-
360- // Mapping HTTP2ResponseFinishedStatus to a MessageRequestObserverInterface::Status. Note that no mapping is
361- // provided from the COMPLETE status so that the logic below falls through to map the HTTPResponseCode value
362- // from the completed requests to the appropriate MessageRequestObserverInterface value.
363- static const std::unordered_map<HTTP2ResponseFinishedStatus, MessageRequestObserverInterface::Status, statusHash>
364- statusToResult = {
365- {HTTP2ResponseFinishedStatus::INTERNAL_ERROR, MessageRequestObserverInterface::Status::INTERNAL_ERROR},
366- {HTTP2ResponseFinishedStatus::CANCELLED, MessageRequestObserverInterface::Status::CANCELED},
367- {HTTP2ResponseFinishedStatus::TIMEOUT, MessageRequestObserverInterface::Status::TIMEDOUT}};
368-
369- // Map HTTPResponseCode values to MessageRequestObserverInterface::Status values.
370- static const std::unordered_map<long , MessageRequestObserverInterface::Status> responseToResult = {
371- {HTTPResponseCode::HTTP_RESPONSE_CODE_UNDEFINED, MessageRequestObserverInterface::Status::INTERNAL_ERROR},
372- {HTTPResponseCode::SUCCESS_OK, MessageRequestObserverInterface::Status::SUCCESS},
373- {HTTPResponseCode::SUCCESS_ACCEPTED, MessageRequestObserverInterface::Status::SUCCESS_ACCEPTED},
374- {HTTPResponseCode::SUCCESS_NO_CONTENT, MessageRequestObserverInterface::Status::SUCCESS_NO_CONTENT},
375- {HTTPResponseCode::CLIENT_ERROR_BAD_REQUEST, MessageRequestObserverInterface::Status::BAD_REQUEST},
376- {HTTPResponseCode::CLIENT_ERROR_FORBIDDEN, MessageRequestObserverInterface::Status::INVALID_AUTH},
377- {HTTPResponseCode::CLIENT_ERROR_THROTTLING_EXCEPTION, MessageRequestObserverInterface::Status::THROTTLED},
378- {HTTPResponseCode::SERVER_ERROR_INTERNAL, MessageRequestObserverInterface::Status::SERVER_INTERNAL_ERROR_V2},
379- {HTTPResponseCode::SERVER_UNAVAILABLE, MessageRequestObserverInterface::Status::REFUSED}};
380-
381- auto result = MessageRequestObserverInterface::Status::INTERNAL_ERROR;
376+ bool receivedResponseCode = MessageRequestObserverInterface::Status::PENDING != m_resultStatus;
377+
378+ // Map HTTP2ResponseFinishedStatus to a MessageRequestObserverInterface::Status.
379+
380+ switch (status) {
381+ case HTTP2ResponseFinishedStatus::COMPLETE:
382+ if (!receivedResponseCode) {
383+ m_resultStatus = MessageRequestObserverInterface::Status::INTERNAL_ERROR;
384+ }
385+ break ;
386+ case HTTP2ResponseFinishedStatus::TIMEOUT:
387+ m_resultStatus = MessageRequestObserverInterface::Status::TIMEDOUT;
388+ break ;
389+ case HTTP2ResponseFinishedStatus::CANCELLED:
390+ m_resultStatus = MessageRequestObserverInterface::Status::CANCELED;
391+ break ;
392+ case HTTP2ResponseFinishedStatus::INTERNAL_ERROR:
393+ m_resultStatus = MessageRequestObserverInterface::Status::INTERNAL_ERROR;
394+ break ;
395+ default :
396+ ACSDK_ERROR (LX (" unhandledHTTP2ResponseFinishedStatus" ).d (" status" , status));
397+ m_resultStatus = MessageRequestObserverInterface::Status::INTERNAL_ERROR;
398+ }
382399
383- if (HTTP2ResponseFinishedStatus::COMPLETE == status) {
384- auto responseIterator = responseToResult.find (m_responseCode);
385- if (responseIterator != responseToResult.end ()) {
386- result = responseIterator->second ;
387- } else {
388- result = MessageRequestObserverInterface::Status::SERVER_OTHER_ERROR;
389- }
390- } else {
391- auto statusIterator = statusToResult.find (status);
392- if (statusIterator != statusToResult.end ()) {
393- result = statusIterator->second ;
394- }
400+ if (!receivedResponseCode) {
401+ m_messageRequest->responseStatusReceived (m_resultStatus);
395402 }
396403
397- m_messageRequest->sendCompleted (result );
404+ m_messageRequest->sendCompleted (m_resultStatus );
398405}
399406
400407} // namespace acl
0 commit comments