- // Return template for completion of global logout, or redirect to homeURL.
- return sendLogoutPage(application, response, false, "Global logout completed.");
+ try {
+ checkError(logoutResponse, policy->getIssuerMetadata()); // throws if Status doesn't look good...
+ }
+ catch (std::exception& ex) {
+ if (logout_event) {
+ logout_event->m_exception = &ex;
+ application.getServiceProvider().getTransactionLog()->write(*logout_event);
+ }
+ throw;
+ }
+
+ // If relay state is set, recover the original return URL.
+ if (!relayState.empty())
+ recoverRelayState(application, request, response, relayState);
+
+ // Check for partial logout.
+ const StatusCode* sc = logoutResponse->getStatus() ? logoutResponse->getStatus()->getStatusCode() : nullptr;
+ sc = sc ? sc->getStatusCode() : nullptr;
+ if (sc && XMLString::equals(sc->getValue(), StatusCode::PARTIAL_LOGOUT)) {
+ if (logout_event)
+ application.getServiceProvider().getTransactionLog()->write(*logout_event);
+ return sendLogoutPage(application, request, response, "partial");
+ }
+
+ if (logout_event) {
+ logout_event->m_logoutType = LogoutEvent::LOGOUT_EVENT_GLOBAL;
+ application.getServiceProvider().getTransactionLog()->write(*logout_event);
+ }
+
+ if (!relayState.empty()) {
+ application.limitRedirect(request, relayState.c_str());
+ return make_pair(true, response.sendRedirect(relayState.c_str()));
+ }
+
+ // Return template for completion of logout.
+ return sendLogoutPage(application, request, response, "global");