/* Copyright (C) 2003-2011 JabRef contributors. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package net.sf.jabref.net; import java.net.CookieHandler; import java.net.URI; import java.util.*; import java.io.IOException; /** * */ public class CookieHandlerImpl extends CookieHandler { // "Long" term storage for cookies, not serialized so only // for current JVM instance private List<Cookie> cache = new LinkedList<Cookie>(); /** * Saves all applicable cookies present in the response * headers into cache. * * @param uri URI source of cookies * @param responseHeaders Immutable map from field names to * lists of field * values representing the response header fields returned */ public void put( URI uri, Map<String, List<String>> responseHeaders) throws IOException { List<String> setCookieList = responseHeaders.get("Set-Cookie"); if (setCookieList != null) { for (String item : setCookieList) { Cookie cookie = new Cookie(uri, item); // Remove cookie if it already exists // New one will replace for (Iterator<Cookie> i = cache.iterator(); i.hasNext();) { Cookie existingCookie = i.next(); if (/*(cookie.getURI().equals( existingCookie.getURI()))*/ (cookie.domain.equals(existingCookie.domain)) && (cookie.getName().equals( existingCookie.getName()))) { i.remove(); break; } } //System.out.println(cookie.getName()+" : "+cookie.domain+" : "+cookie.toString()); cache.add(cookie); } } } /** * Gets all the applicable cookies from a cookie cache for * the specified uri in the request header. * * @param uri URI to send cookies to in a request * @param requestHeaders Map from request header field names * to lists of field values representing the current request * headers * @return Immutable map, with field name "Cookie" to a list * of cookies */ public Map<String, List<String>> get( URI uri, Map<String, List<String>> requestHeaders) throws IOException { // Retrieve all the cookies for matching URI // Put in comma-separated list StringBuilder cookies = new StringBuilder(); for (Iterator<Cookie> i = cache.iterator(); i.hasNext();) { //for (Cookie cookie : cache) { Cookie cookie = i.next(); // Remove cookies that have expired if (cookie.hasExpired()) { i.remove(); } else if (cookie.matches(uri)) { if (cookies.length() > 0) { cookies.append(", "); } cookies.append(cookie.toString()); } } // Map to return Map<String, List<String>> cookieMap = new HashMap<String, List<String>>(requestHeaders); // Convert StringBuilder to List, store in map if (cookies.length() > 0) { List<String> list = Collections.singletonList(cookies.toString()); cookieMap.put("Cookie", list); } return Collections.unmodifiableMap(cookieMap); } }