+// String message = "POST not allowed for the subscriptionURL.";\r
+// EventLogRecord elr = new EventLogRecord(req);\r
+// elr.setMessage(message);\r
+// elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);\r
+// eventlogger.info(elr);\r
+// resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);\r
+\r
+ setIpFqdnRequestIDandInvocationIDForEelf("doPost", req);\r
+ eelflogger.info(EelfMsgs.ENTRY);\r
+ try {\r
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));\r
+ EventLogRecord elr = new EventLogRecord(req);\r
+ String message = isAuthorizedForProvisioning(req);\r
+ if (message != null) {\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
+ eventlogger.info(elr);\r
+ sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
+ return;\r
+ }\r
+ if (isProxyServer()) {\r
+ super.doPost(req, resp);\r
+ return;\r
+ }\r
+ String bhdr = req.getHeader(BEHALF_HEADER);\r
+ if (bhdr == null) {\r
+ message = "Missing " + BEHALF_HEADER + " header.";\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
+ eventlogger.info(elr);\r
+ sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
+ return;\r
+ }\r
+ final int subid = getIdFromPath(req);\r
+ if (subid < 0 || Subscription.getSubscriptionById(subid) == null) {\r
+ message = "Missing or bad subscription number.";\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
+ eventlogger.info(elr);\r
+ sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
+ return;\r
+ }\r
+ // check content type is SUBCNTRL_CONTENT_TYPE, version 1.0\r
+ ContentHeader ch = getContentHeader(req);\r
+ String ver = ch.getAttribute("version");\r
+ if (!ch.getType().equals(SUBCNTRL_CONTENT_TYPE) || !ver.equals("1.0")) {\r
+ message = "Incorrect content-type";\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);\r
+ eventlogger.info(elr);\r
+ sendResponseError(resp, HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message, eventlogger);\r
+ return;\r
+ }\r
+ // Check with the Authorizer\r
+ AuthorizationResponse aresp = authz.decide(req);\r
+ if (!aresp.isAuthorized()) {\r
+ message = "Policy Engine disallows access.";\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
+ eventlogger.info(elr);\r
+ sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
+ return;\r
+ }\r
+ JSONObject jo = getJSONfromInput(req);\r
+ if (jo == null) {\r
+ message = "Badly formed JSON";\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
+ eventlogger.info(elr);\r
+ sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
+ return;\r
+ }\r
+ try {\r
+ // Only the active POD sends notifications\r
+ boolean active = SynchronizerTask.getSynchronizer().isActive();\r
+ boolean b = jo.getBoolean("failed");\r
+ if (active && !b) {\r
+ // Notify all nodes to reset the subscription\r
+ SubscriberNotifyThread t = new SubscriberNotifyThread();\r
+ t.resetSubscription(subid);\r
+ t.start();\r
+ }\r
+ // send response\r
+ elr.setResult(HttpServletResponse.SC_ACCEPTED);\r
+ eventlogger.info(elr);\r
+ resp.setStatus(HttpServletResponse.SC_ACCEPTED);\r
+ } catch (JSONException e) {\r
+ message = "Badly formed JSON";\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
+ eventlogger.info(elr);\r
+ sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
+ }\r
+ } finally {\r
+ eelflogger.info(EelfMsgs.EXIT);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * A Thread class used to serially send reset notifications to all nodes in the DR network, when a POST is received\r
+ * for a subscription.\r
+ */\r
+ public class SubscriberNotifyThread extends Thread {\r
+\r
+ public static final String URL_TEMPLATE = "http://%s/internal/resetSubscription/%d";\r
+ private List<String> urls = new Vector<String>();\r