Index: modules/quercus/src/com/caucho/quercus/env/Env.java =================================================================== --- modules/quercus/src/com/caucho/quercus/env/Env.java (revision 8437) +++ modules/quercus/src/com/caucho/quercus/env/Env.java (working copy) @@ -2641,6 +2641,9 @@ return null; } + private static final boolean SUPPORT_ARRAY_COOKIES = Boolean.valueOf( + System.getProperty("resin.support_array_cookies", "true")); + protected ArrayValue getCookies() { ArrayValue array = new ArrayValueImpl(); @@ -2658,13 +2661,82 @@ if (isMagicQuotes) // php/0876 valueAsValue = StringModule.addslashes(valueAsValue); - array.append(createString(cookie.getName()), valueAsValue); + String name = cookie.getName(); + + if (SUPPORT_ARRAY_COOKIES) { + + int p = name.indexOf('['); + int q = name.lastIndexOf(']'); + + if (p > 0 && q > p && q + 1 == name.length()) { + String arrName = name.substring(0, p); + String arrIndex = name.substring(p + 1, q); + List indices = getIndices(arrIndex); + handleArrayCookie(array, arrName, indices, valueAsValue); + } else { + array.append(createString(name), valueAsValue); + } + + } else { + array.append(createString(name), valueAsValue); + } } - } + } return array; } + /** + * should not exist in cookie even in + * non-org.glassfish.web.rfc2109_cookie_names_enforced standard + * + * @see javax.servlet.http.Cookie + */ + private static final String TSPECIAL = ";"; + + private static List getIndices(String str) { + StringTokenizer tokenizer = new StringTokenizer(str.replace("][", + TSPECIAL), TSPECIAL); + + List indices = new LinkedList(); + + while (tokenizer.hasMoreTokens()) { + indices.add(tokenizer.nextToken()); + } + + return indices; + } + + private void handleArrayCookie(ArrayValue array, String arrName, + List indices, StringValue valueAsValue) { + + StringValue arrNameValue = createString(arrName); + + Value oldValue = array.get(arrNameValue); + ArrayValue arrayValue = null; + + if (UnsetValue.UNSET.eq(oldValue)) { + arrayValue = new ArrayValueImpl(); + array.append(arrNameValue, arrayValue); + + } else if (oldValue.isArray()) { + arrayValue = (ArrayValue) oldValue; + + } else { + log.warning("cannot set array cookie - value already exists and is not an array as expected"); + return; + } + + String arrIndex = indices.remove(0); + + if (indices.size() > 0) { + handleArrayCookie(arrayValue, arrIndex, indices, valueAsValue); + } else { + arrayValue.append(createString(arrIndex), valueAsValue); + } + } + + public void setArgs(String []args) { if (_quercus.getIniBoolean("register_argc_argv")) {