From 9c084821c425b5bb792eab4e0b27c05cfc4c825c Mon Sep 17 00:00:00 2001 From: "John J. Aylward" Date: Fri, 22 May 2020 16:45:54 -0400 Subject: [PATCH] Updates Cookie class to be a more generic in attribute parsing and emit. This is so the library can age better as new attributes are added to RFC revisions. --- src/main/java/org/json/Cookie.java | 4 ++- src/test/java/org/json/junit/CookieTest.java | 38 +++++++++++++------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/json/Cookie.java b/src/main/java/org/json/Cookie.java index 5da423a87..73e6c0f82 100644 --- a/src/main/java/org/json/Cookie.java +++ b/src/main/java/org/json/Cookie.java @@ -76,7 +76,9 @@ public static String escape(String string) { * @param string The cookie specification string. * @return A JSONObject containing "name", "value", and possibly other * members. - * @throws JSONException if a called function fails or a syntax error + * @throws JSONException If there is an error parsing the Cookie String. + * Cookie strings must have at least one '=' character and the 'name' + * portion of the cookie must not be blank. */ public static JSONObject toJSONObject(String string) throws JSONException { String name; diff --git a/src/test/java/org/json/junit/CookieTest.java b/src/test/java/org/json/junit/CookieTest.java index 74756aadd..fc293910d 100644 --- a/src/test/java/org/json/junit/CookieTest.java +++ b/src/test/java/org/json/junit/CookieTest.java @@ -79,32 +79,46 @@ public void malFormedNameValueException() { * Expects a JSONException. */ @Test - public void malFormedAttributeException() { + public void booleanAttribute() { String cookieStr = "this=Cookie;myAttribute"; + JSONObject jo = Cookie.toJSONObject(cookieStr); + assertTrue("has key 'name'", jo.has("name")); + assertTrue("has key 'value'", jo.has("value")); + assertTrue("has key 'myAttribute'", jo.has("myAttribute")); + } + + /** + * Attempts to create a JSONObject from an empty cookie string.
+ * Note: Cookie throws an exception, but CookieList does not.
+ * Expects a JSONException + */ + @Test + public void emptyStringCookieException() { + String cookieStr = ""; try { Cookie.toJSONObject(cookieStr); fail("Expecting an exception"); } catch (JSONException e) { assertEquals("Expecting an exception message", - "Missing '=' in cookie parameter. at 23 [character 24 line 1]", + "Cookies must have a 'name'", e.getMessage()); } } - /** - * Attempts to create a JSONObject from an empty cookie string.
+ * + * Attempts to create a JSONObject from an cookie string where the name is blank.
* Note: Cookie throws an exception, but CookieList does not.
* Expects a JSONException */ @Test - public void emptyStringCookieException() { - String cookieStr = ""; + public void emptyNameCookieException() { + String cookieStr = " = value "; try { Cookie.toJSONObject(cookieStr); fail("Expecting an exception"); } catch (JSONException e) { assertEquals("Expecting an exception message", - "Expected '=' and instead saw '' at 0 [character 1 line 1]", + "Cookies must have a 'name'", e.getMessage()); } } @@ -149,8 +163,8 @@ public void multiPartCookie() { } /** - * Cookie.toString() will omit the non-standard "thiswont=beIncluded" - * attribute, but the attribute is still stored in the JSONObject. + * Cookie.toString() will emit the non-standard "thiswont=beIncluded" + * attribute, and the attribute is still stored in the JSONObject. * This test confirms both behaviors. */ @Test @@ -163,15 +177,15 @@ public void convertCookieToString() { "thisWont=beIncluded;"+ "secure"; String expectedCookieStr = - "{\"path\":\"/\","+ + "{\"thisWont\":\"beIncluded\","+ + "\"path\":\"/\","+ "\"expires\":\"Wed, 19-Mar-2014 17:53:53 GMT\","+ "\"domain\":\".yahoo.com\","+ "\"name\":\"PH\","+ "\"secure\":true,"+ "\"value\":\"deleted\"}"; // Add the nonstandard attribute to the expected cookie string - String expectedDirectCompareCookieStr = - expectedCookieStr.replaceAll("\\{", "\\{\"thisWont\":\"beIncluded\","); + String expectedDirectCompareCookieStr = expectedCookieStr; // convert all strings into JSONObjects JSONObject jsonObject = Cookie.toJSONObject(cookieStr); JSONObject expectedJsonObject = new JSONObject(expectedCookieStr);