Merge "Fix Vulnerabilities in BaseServlet"
[dmaap/datarouter.git] / datarouter-prov / src / main / java / org / onap / dmaap / datarouter / provisioning / SubscriptionServlet.java
1 /*******************************************************************************\r
2  * ============LICENSE_START==================================================\r
3  * * org.onap.dmaap\r
4  * * ===========================================================================\r
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
6  * * ===========================================================================\r
7  * * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * * you may not use this file except in compliance with the License.\r
9  * * You may obtain a copy of the License at\r
10  * *\r
11  *  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * *\r
13  *  * Unless required by applicable law or agreed to in writing, software\r
14  * * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * * See the License for the specific language governing permissions and\r
17  * * limitations under the License.\r
18  * * ============LICENSE_END====================================================\r
19  * *\r
20  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
21  * *\r
22  ******************************************************************************/\r
23 \r
24 \r
25 package org.onap.dmaap.datarouter.provisioning;\r
26 \r
27 import java.io.IOException;\r
28 import java.io.InvalidObjectException;\r
29 import java.net.HttpURLConnection;\r
30 import java.net.URL;\r
31 import java.util.List;\r
32 import java.util.Vector;\r
33 \r
34 import javax.servlet.http.HttpServletRequest;\r
35 import javax.servlet.http.HttpServletResponse;\r
36 \r
37 import org.json.JSONException;\r
38 import org.json.JSONObject;\r
39 import org.onap.dmaap.datarouter.authz.AuthorizationResponse;\r
40 import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;\r
41 import org.onap.dmaap.datarouter.provisioning.beans.Subscription;\r
42 import org.onap.dmaap.datarouter.provisioning.eelf.EelfMsgs;\r
43 \r
44 import com.att.eelf.configuration.EELFLogger;\r
45 import com.att.eelf.configuration.EELFManager;\r
46 \r
47 import static org.onap.dmaap.datarouter.provisioning.utils.HttpServletUtils.sendResponseError;\r
48 \r
49 /**\r
50  * This servlet handles provisioning for the <subscriptionURL> which is generated by the provisioning server to\r
51  * handle the inspection, modification, and deletion of a particular subscription to a feed. It supports DELETE to\r
52  * delete a subscription, GET to retrieve information about the subscription, and PUT to modify the subscription.  In DR\r
53  * 3.0, POST is also supported in order to reset the subscription timers for individual subscriptions.\r
54  *\r
55  * @author Robert Eby\r
56  * @version $Id$\r
57  */\r
58 @SuppressWarnings("serial")\r
59 public class SubscriptionServlet extends ProxyServlet {\r
60 \r
61     public static final String SUBCNTRL_CONTENT_TYPE = "application/vnd.att-dr.subscription-control";\r
62     //Adding EELF Logger Rally:US664892\r
63     private static EELFLogger eelflogger = EELFManager.getInstance()\r
64         .getLogger("org.onap.dmaap.datarouter.provisioning.SubscriptionServlet");\r
65 \r
66     /**\r
67      * DELETE on the &lt;subscriptionUrl&gt; -- delete a subscription. See the <i>Deleting a Subscription</i> section in\r
68      * the <b>Provisioning API</b> document for details on how this method should be invoked.\r
69      */\r
70     @Override\r
71     public void doDelete(HttpServletRequest req, HttpServletResponse resp) {\r
72         setIpAndFqdnForEelf("doDelete");\r
73         eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER), getIdFromPath(req) + "");\r
74         EventLogRecord elr = new EventLogRecord(req);\r
75         String message = isAuthorizedForProvisioning(req);\r
76         if (message != null) {\r
77             elr.setMessage(message);\r
78             elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
79             eventlogger.info(elr);\r
80             sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
81             return;\r
82         }\r
83         if (isProxyServer()) {\r
84             try {\r
85                 super.doDelete(req, resp);\r
86             } catch (IOException ioe) {\r
87                 eventlogger.error("IOException: " + ioe.getMessage());\r
88             }\r
89             return;\r
90         }\r
91         String bhdr = req.getHeader(BEHALF_HEADER);\r
92         if (bhdr == null) {\r
93             message = "Missing " + BEHALF_HEADER + " header.";\r
94             elr.setMessage(message);\r
95             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
96             eventlogger.info(elr);\r
97             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
98             return;\r
99         }\r
100         int subid = getIdFromPath(req);\r
101         if (subid < 0) {\r
102             message = "Missing or bad subscription number.";\r
103             elr.setMessage(message);\r
104             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
105             eventlogger.info(elr);\r
106             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
107             return;\r
108         }\r
109         Subscription sub = Subscription.getSubscriptionById(subid);\r
110         if (sub == null) {\r
111             message = "Missing or bad subscription number.";\r
112             elr.setMessage(message);\r
113             elr.setResult(HttpServletResponse.SC_NOT_FOUND);\r
114             eventlogger.info(elr);\r
115             sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, message, eventlogger);\r
116             return;\r
117         }\r
118         // Check with the Authorizer\r
119         AuthorizationResponse aresp = authz.decide(req);\r
120         if (!aresp.isAuthorized()) {\r
121             message = "Policy Engine disallows access.";\r
122             elr.setMessage(message);\r
123             elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
124             eventlogger.info(elr);\r
125             sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
126             return;\r
127         }\r
128 \r
129         // Delete Subscription\r
130         if (doDelete(sub)) {\r
131             activeSubs--;\r
132             // send response\r
133             elr.setResult(HttpServletResponse.SC_NO_CONTENT);\r
134             eventlogger.info(elr);\r
135             resp.setStatus(HttpServletResponse.SC_NO_CONTENT);\r
136             provisioningDataChanged();\r
137         } else {\r
138             // Something went wrong with the DELETE\r
139             elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\r
140             eventlogger.info(elr);\r
141             sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG, intlogger);\r
142         }\r
143     }\r
144 \r
145     /**\r
146      * GET on the &lt;subscriptionUrl&gt; -- get information about a subscription. See the <i>Retreiving Information\r
147      * about a Subscription</i> section in the <b>Provisioning API</b> document for details on how this method should be\r
148      * invoked.\r
149      */\r
150     @Override\r
151     public void doGet(HttpServletRequest req, HttpServletResponse resp) {\r
152         setIpAndFqdnForEelf("doGet");\r
153         eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER), getIdFromPath(req) + "");\r
154         EventLogRecord elr = new EventLogRecord(req);\r
155         String message = isAuthorizedForProvisioning(req);\r
156         if (message != null) {\r
157             elr.setMessage(message);\r
158             elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
159             eventlogger.info(elr);\r
160             sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
161             return;\r
162         }\r
163         if (isProxyServer()) {\r
164             try {\r
165                 super.doGet(req, resp);\r
166             } catch (IOException ioe) {\r
167                 eventlogger.error("IOException: " + ioe.getMessage());\r
168             }\r
169             return;\r
170         }\r
171         String bhdr = req.getHeader(BEHALF_HEADER);\r
172         if (bhdr == null) {\r
173             message = "Missing " + BEHALF_HEADER + " header.";\r
174             elr.setMessage(message);\r
175             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
176             eventlogger.info(elr);\r
177             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
178             return;\r
179         }\r
180         int subid = getIdFromPath(req);\r
181         if (subid < 0) {\r
182             message = "Missing or bad subscription number.";\r
183             elr.setMessage(message);\r
184             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
185             eventlogger.info(elr);\r
186             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
187             return;\r
188         }\r
189         Subscription sub = Subscription.getSubscriptionById(subid);\r
190         if (sub == null) {\r
191             message = "Missing or bad subscription number.";\r
192             elr.setMessage(message);\r
193             elr.setResult(HttpServletResponse.SC_NOT_FOUND);\r
194             eventlogger.info(elr);\r
195             sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, message, eventlogger);\r
196             return;\r
197         }\r
198         // Check with the Authorizer\r
199         AuthorizationResponse aresp = authz.decide(req);\r
200         if (!aresp.isAuthorized()) {\r
201             message = "Policy Engine disallows access.";\r
202             elr.setMessage(message);\r
203             elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
204             eventlogger.info(elr);\r
205             sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
206             return;\r
207         }\r
208 \r
209         // send response\r
210         elr.setResult(HttpServletResponse.SC_OK);\r
211         eventlogger.info(elr);\r
212         resp.setStatus(HttpServletResponse.SC_OK);\r
213         resp.setContentType(SUBFULL_CONTENT_TYPE);\r
214         try {\r
215             resp.getOutputStream().print(sub.asJSONObject(true).toString());\r
216         } catch (IOException ioe) {\r
217             eventlogger.error("IOException: " + ioe.getMessage());\r
218         }\r
219     }\r
220 \r
221     /**\r
222      * PUT on the &lt;subscriptionUrl&gt; -- modify a subscription. See the <i>Modifying a Subscription</i> section in\r
223      * the <b>Provisioning API</b> document for details on how this method should be invoked.\r
224      */\r
225     @Override\r
226     public void doPut(HttpServletRequest req, HttpServletResponse resp) {\r
227         setIpAndFqdnForEelf("doPut");\r
228         eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER), getIdFromPath(req) + "");\r
229         EventLogRecord elr = new EventLogRecord(req);\r
230         String message = isAuthorizedForProvisioning(req);\r
231         if (message != null) {\r
232             elr.setMessage(message);\r
233             elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
234             eventlogger.info(elr);\r
235             sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
236             return;\r
237         }\r
238         if (isProxyServer()) {\r
239             try {\r
240                 super.doPut(req, resp);\r
241             } catch (IOException ioe) {\r
242                 eventlogger.error("IOException: " + ioe.getMessage());\r
243             }\r
244             return;\r
245         }\r
246         String bhdr = req.getHeader(BEHALF_HEADER);\r
247         if (bhdr == null) {\r
248             message = "Missing " + BEHALF_HEADER + " header.";\r
249             elr.setMessage(message);\r
250             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
251             eventlogger.info(elr);\r
252             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
253             return;\r
254         }\r
255         int subid = getIdFromPath(req);\r
256         if (subid < 0) {\r
257             message = "Missing or bad subscription number.";\r
258             elr.setMessage(message);\r
259             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
260             eventlogger.info(elr);\r
261             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
262             return;\r
263         }\r
264         Subscription oldsub = Subscription.getSubscriptionById(subid);\r
265         if (oldsub == null) {\r
266             message = "Missing or bad subscription number.";\r
267             elr.setMessage(message);\r
268             elr.setResult(HttpServletResponse.SC_NOT_FOUND);\r
269             eventlogger.info(elr);\r
270             sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, message, eventlogger);\r
271             return;\r
272         }\r
273         // Check with the Authorizer\r
274         AuthorizationResponse aresp = authz.decide(req);\r
275         if (!aresp.isAuthorized()) {\r
276             message = "Policy Engine disallows access.";\r
277             elr.setMessage(message);\r
278             elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
279             eventlogger.info(elr);\r
280             sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
281             return;\r
282         }\r
283         // check content type is SUB_CONTENT_TYPE, version 1.0\r
284         ContentHeader ch = getContentHeader(req);\r
285         String ver = ch.getAttribute("version");\r
286         if (!ch.getType().equals(SUB_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {\r
287             message = "Incorrect content-type";\r
288             elr.setMessage(message);\r
289             elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);\r
290             eventlogger.info(elr);\r
291             sendResponseError(resp, HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message, eventlogger);\r
292             return;\r
293         }\r
294         JSONObject jo = getJSONfromInput(req);\r
295         if (jo == null) {\r
296             message = "Badly formed JSON";\r
297             elr.setMessage(message);\r
298             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
299             eventlogger.info(elr);\r
300             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
301             return;\r
302         }\r
303         if (intlogger.isDebugEnabled()) {\r
304             intlogger.debug(jo.toString());\r
305         }\r
306         Subscription sub = null;\r
307         try {\r
308             sub = new Subscription(jo);\r
309         } catch (InvalidObjectException e) {\r
310             message = e.getMessage();\r
311             elr.setMessage(message);\r
312             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
313             eventlogger.info(elr);\r
314             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
315             return;\r
316         }\r
317         sub.setSubid(oldsub.getSubid());\r
318         sub.setFeedid(oldsub.getFeedid());\r
319         sub.setSubscriber(bhdr);    // set from X-ATT-DR-ON-BEHALF-OF header\r
320 \r
321         String subjectgroup = (req.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")); //Adding for group feature:Rally US708115\r
322         if (!oldsub.getSubscriber().equals(sub.getSubscriber()) && subjectgroup == null) {\r
323             message = "This subscriber must be modified by the same subscriber that created it.";\r
324             elr.setMessage(message);\r
325             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
326             eventlogger.info(elr);\r
327             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
328             return;\r
329         }\r
330 \r
331         // Update SUBSCRIPTIONS table entries\r
332         if (doUpdate(sub)) {\r
333             // send response\r
334             elr.setResult(HttpServletResponse.SC_OK);\r
335             eventlogger.info(elr);\r
336             resp.setStatus(HttpServletResponse.SC_OK);\r
337             resp.setContentType(SUBFULL_CONTENT_TYPE);\r
338             try {\r
339                 resp.getOutputStream().print(sub.asLimitedJSONObject().toString());\r
340             } catch (IOException ioe) {\r
341                 eventlogger.error("IOException: " + ioe.getMessage());\r
342             }\r
343 \r
344             /**Change Owner ship of Subscriber     Adding for group feature:Rally US708115*/\r
345             if (jo.has("changeowner") && subjectgroup != null) {\r
346                 try {\r
347                     Boolean changeowner = (Boolean) jo.get("changeowner");\r
348                     if (changeowner != null && changeowner.equals(true)) {\r
349                         sub.setSubscriber(req.getHeader(BEHALF_HEADER));\r
350                         sub.changeOwnerShip();\r
351                     }\r
352                 } catch (JSONException je) {\r
353                     eventlogger.error("JSONException: " + je.getMessage());\r
354                 }\r
355             }\r
356             /***End of change ownership*/\r
357 \r
358             provisioningDataChanged();\r
359         } else {\r
360             // Something went wrong with the UPDATE\r
361             elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\r
362             eventlogger.info(elr);\r
363             sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG, intlogger);\r
364         }\r
365     }\r
366 \r
367     /**\r
368      * POST on the &lt;subscriptionUrl&gt; -- control a subscription. See the <i>Resetting a Subscription's Retry\r
369      * Schedule</i> section in the <b>Provisioning API</b> document for details on how this method should be invoked.\r
370      */\r
371     @Override\r
372     public void doPost(HttpServletRequest req, HttpServletResponse resp) {\r
373 // OLD pre-3.0 code\r
374 //        String message = "POST not allowed for the subscriptionURL.";\r
375 //        EventLogRecord elr = new EventLogRecord(req);\r
376 //        elr.setMessage(message);\r
377 //        elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);\r
378 //        eventlogger.info(elr);\r
379 //        resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);\r
380 \r
381         setIpAndFqdnForEelf("doPost");\r
382         eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));\r
383         EventLogRecord elr = new EventLogRecord(req);\r
384         String message = isAuthorizedForProvisioning(req);\r
385         if (message != null) {\r
386             elr.setMessage(message);\r
387             elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
388             eventlogger.info(elr);\r
389             sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
390             return;\r
391         }\r
392         if (isProxyServer()) {\r
393             try {\r
394                 super.doPost(req, resp);\r
395             } catch (IOException ioe) {\r
396                 eventlogger.error("IOException: " + ioe.getMessage());\r
397             }\r
398             return;\r
399         }\r
400         String bhdr = req.getHeader(BEHALF_HEADER);\r
401         if (bhdr == null) {\r
402             message = "Missing " + BEHALF_HEADER + " header.";\r
403             elr.setMessage(message);\r
404             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
405             eventlogger.info(elr);\r
406             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
407             return;\r
408         }\r
409         final int subid = getIdFromPath(req);\r
410         if (subid < 0 || Subscription.getSubscriptionById(subid) == null) {\r
411             message = "Missing or bad subscription number.";\r
412             elr.setMessage(message);\r
413             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
414             eventlogger.info(elr);\r
415             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
416             return;\r
417         }\r
418         // check content type is SUBCNTRL_CONTENT_TYPE, version 1.0\r
419         ContentHeader ch = getContentHeader(req);\r
420         String ver = ch.getAttribute("version");\r
421         if (!ch.getType().equals(SUBCNTRL_CONTENT_TYPE) || !ver.equals("1.0")) {\r
422             message = "Incorrect content-type";\r
423             elr.setMessage(message);\r
424             elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);\r
425             eventlogger.info(elr);\r
426             sendResponseError(resp, HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message, eventlogger);\r
427             return;\r
428         }\r
429         // Check with the Authorizer\r
430         AuthorizationResponse aresp = authz.decide(req);\r
431         if (!aresp.isAuthorized()) {\r
432             message = "Policy Engine disallows access.";\r
433             elr.setMessage(message);\r
434             elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
435             eventlogger.info(elr);\r
436             sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
437             return;\r
438         }\r
439         JSONObject jo = getJSONfromInput(req);\r
440         if (jo == null) {\r
441             message = "Badly formed JSON";\r
442             elr.setMessage(message);\r
443             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
444             eventlogger.info(elr);\r
445             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
446             return;\r
447         }\r
448         try {\r
449             // Only the active POD sends notifications\r
450             boolean active = SynchronizerTask.getSynchronizer().isActive();\r
451             boolean b = jo.getBoolean("failed");\r
452             if (active && !b) {\r
453                 // Notify all nodes to reset the subscription\r
454                 SubscriberNotifyThread t = new SubscriberNotifyThread();\r
455                 t.resetSubscription(subid);\r
456                 t.start();\r
457             }\r
458             // send response\r
459             elr.setResult(HttpServletResponse.SC_ACCEPTED);\r
460             eventlogger.info(elr);\r
461             resp.setStatus(HttpServletResponse.SC_ACCEPTED);\r
462         } catch (JSONException e) {\r
463             message = "Badly formed JSON";\r
464             elr.setMessage(message);\r
465             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
466             eventlogger.info(elr);\r
467             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
468         }\r
469     }\r
470 \r
471     /**\r
472      * A Thread class used to serially send reset notifications to all nodes in the DR network, when a POST is received\r
473      * for a subscription.\r
474      */\r
475     public class SubscriberNotifyThread extends Thread {\r
476 \r
477         public static final String URL_TEMPLATE = "http://%s/internal/resetSubscription/%d";\r
478         private List<String> urls = new Vector<String>();\r
479 \r
480         public SubscriberNotifyThread() {\r
481             setName("SubscriberNotifyThread");\r
482         }\r
483 \r
484         public void resetSubscription(int subid) {\r
485             for (String nodename : BaseServlet.getNodes()) {\r
486                 String u = String.format(URL_TEMPLATE, nodename, subid);\r
487                 urls.add(u);\r
488             }\r
489         }\r
490 \r
491         public void run() {\r
492             try {\r
493                 while (!urls.isEmpty()) {\r
494                     String u = urls.remove(0);\r
495                     try {\r
496                         URL url = new URL(u);\r
497                         HttpURLConnection conn = (HttpURLConnection) url.openConnection();\r
498                         conn.connect();\r
499                         conn.getContentLength();    // Force the GET through\r
500                         conn.disconnect();\r
501                     } catch (IOException e) {\r
502                         intlogger.info("IOException Error accessing URL: " + u + ": " + e.getMessage());\r
503                     }\r
504                 }\r
505             } catch (Exception e) {\r
506                 intlogger.warn("Caught exception in SubscriberNotifyThread: " + e);\r
507             }\r
508         }\r
509     }\r
510 }\r