--- /dev/null
+/*******************************************************************************\r
+ * ============LICENSE_START==================================================\r
+ * * org.onap.dmaap\r
+ * * ===========================================================================\r
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
+ * * ===========================================================================\r
+ * * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * * you may not use this file except in compliance with the License.\r
+ * * You may obtain a copy of the License at\r
+ * * \r
+ * * http://www.apache.org/licenses/LICENSE-2.0\r
+ * * \r
+ * * Unless required by applicable law or agreed to in writing, software\r
+ * * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * * See the License for the specific language governing permissions and\r
+ * * limitations under the License.\r
+ * * ============LICENSE_END====================================================\r
+ * *\r
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
+ * *\r
+ ******************************************************************************/\r
+package org.json;\r
+\r
+/*\r
+Copyright (c) 2002 JSON.org\r
+\r
+Permission is hereby granted, free of charge, to any person obtaining a copy\r
+of this software and associated documentation files (the "Software"), to deal\r
+in the Software without restriction, including without limitation the rights\r
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
+copies of the Software, and to permit persons to whom the Software is\r
+furnished to do so, subject to the following conditions:\r
+\r
+The above copyright notice and this permission notice shall be included in all\r
+copies or substantial portions of the Software.\r
+\r
+The Software shall be used for Good, not Evil.\r
+\r
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+SOFTWARE.\r
+*/\r
+\r
+/**\r
+ * Convert a web browser cookie specification to a JSONObject and back.\r
+ * JSON and Cookies are both notations for name/value pairs.\r
+ * @author JSON.org\r
+ * @version 2010-12-24\r
+ */\r
+public class Cookie {\r
+\r
+ /**\r
+ * Produce a copy of a string in which the characters '+', '%', '=', ';'\r
+ * and control characters are replaced with "%hh". This is a gentle form\r
+ * of URL encoding, attempting to cause as little distortion to the\r
+ * string as possible. The characters '=' and ';' are meta characters in\r
+ * cookies. By convention, they are escaped using the URL-encoding. This is\r
+ * only a convention, not a standard. Often, cookies are expected to have\r
+ * encoded values. We encode '=' and ';' because we must. We encode '%' and\r
+ * '+' because they are meta characters in URL encoding.\r
+ * @param string The source string.\r
+ * @return The escaped result.\r
+ */\r
+ public static String escape(String string) {\r
+ char c;\r
+ String s = string.trim();\r
+ StringBuffer sb = new StringBuffer();\r
+ int length = s.length();\r
+ for (int i = 0; i < length; i += 1) {\r
+ c = s.charAt(i);\r
+ if (c < ' ' || c == '+' || c == '%' || c == '=' || c == ';') {\r
+ sb.append('%');\r
+ sb.append(Character.forDigit((char)((c >>> 4) & 0x0f), 16));\r
+ sb.append(Character.forDigit((char)(c & 0x0f), 16));\r
+ } else {\r
+ sb.append(c);\r
+ }\r
+ }\r
+ return sb.toString();\r
+ }\r
+\r
+\r
+ /**\r
+ * Convert a cookie specification string into a JSONObject. The string\r
+ * will contain a name value pair separated by '='. The name and the value\r
+ * will be unescaped, possibly converting '+' and '%' sequences. The\r
+ * cookie properties may follow, separated by ';', also represented as\r
+ * name=value (except the secure property, which does not have a value).\r
+ * The name will be stored under the key "name", and the value will be\r
+ * stored under the key "value". This method does not do checking or\r
+ * validation of the parameters. It only converts the cookie string into\r
+ * a JSONObject.\r
+ * @param string The cookie specification string.\r
+ * @return A JSONObject containing "name", "value", and possibly other\r
+ * members.\r
+ * @throws JSONException\r
+ */\r
+ public static JSONObject toJSONObject(String string) throws JSONException {\r
+ String name;\r
+ JSONObject jo = new JSONObject();\r
+ Object value;\r
+ JSONTokener x = new JSONTokener(string);\r
+ jo.put("name", x.nextTo('='));\r
+ x.next('=');\r
+ jo.put("value", x.nextTo(';'));\r
+ x.next();\r
+ while (x.more()) {\r
+ name = unescape(x.nextTo("=;"));\r
+ if (x.next() != '=') {\r
+ if (name.equals("secure")) {\r
+ value = Boolean.TRUE;\r
+ } else {\r
+ throw x.syntaxError("Missing '=' in cookie parameter.");\r
+ }\r
+ } else {\r
+ value = unescape(x.nextTo(';'));\r
+ x.next();\r
+ }\r
+ jo.put(name, value);\r
+ }\r
+ return jo;\r
+ }\r
+\r
+\r
+ /**\r
+ * Convert a JSONObject into a cookie specification string. The JSONObject\r
+ * must contain "name" and "value" members.\r
+ * If the JSONObject contains "expires", "domain", "path", or "secure"\r
+ * members, they will be appended to the cookie specification string.\r
+ * All other members are ignored.\r
+ * @param jo A JSONObject\r
+ * @return A cookie specification string\r
+ * @throws JSONException\r
+ */\r
+ public static String toString(JSONObject jo) throws JSONException {\r
+ StringBuffer sb = new StringBuffer();\r
+\r
+ sb.append(escape(jo.getString("name")));\r
+ sb.append("=");\r
+ sb.append(escape(jo.getString("value")));\r
+ if (jo.has("expires")) {\r
+ sb.append(";expires=");\r
+ sb.append(jo.getString("expires"));\r
+ }\r
+ if (jo.has("domain")) {\r
+ sb.append(";domain=");\r
+ sb.append(escape(jo.getString("domain")));\r
+ }\r
+ if (jo.has("path")) {\r
+ sb.append(";path=");\r
+ sb.append(escape(jo.getString("path")));\r
+ }\r
+ if (jo.optBoolean("secure")) {\r
+ sb.append(";secure");\r
+ }\r
+ return sb.toString();\r
+ }\r
+\r
+ /**\r
+ * Convert <code>%</code><i>hh</i> sequences to single characters, and\r
+ * convert plus to space.\r
+ * @param string A string that may contain\r
+ * <code>+</code> <small>(plus)</small> and\r
+ * <code>%</code><i>hh</i> sequences.\r
+ * @return The unescaped string.\r
+ */\r
+ public static String unescape(String string) {\r
+ int length = string.length();\r
+ StringBuffer sb = new StringBuffer();\r
+ for (int i = 0; i < length; ++i) {\r
+ char c = string.charAt(i);\r
+ if (c == '+') {\r
+ c = ' ';\r
+ } else if (c == '%' && i + 2 < length) {\r
+ int d = JSONTokener.dehexchar(string.charAt(i + 1));\r
+ int e = JSONTokener.dehexchar(string.charAt(i + 2));\r
+ if (d >= 0 && e >= 0) {\r
+ c = (char)(d * 16 + e);\r
+ i += 2;\r
+ }\r
+ }\r
+ sb.append(c);\r
+ }\r
+ return sb.toString();\r
+ }\r
+}\r