Source for gnu.java.net.protocol.http.SimpleCookieManager

   1: /* CookieManager.java --
   2:    Copyright (C) 2004, 2006 Free Software Foundation, Inc.
   3: 
   4: This file is part of GNU Classpath.
   5: 
   6: GNU Classpath is free software; you can redistribute it and/or modify
   7: it under the terms of the GNU General Public License as published by
   8: the Free Software Foundation; either version 2, or (at your option)
   9: any later version.
  10: 
  11: GNU Classpath is distributed in the hope that it will be useful, but
  12: WITHOUT ANY WARRANTY; without even the implied warranty of
  13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14: General Public License for more details.
  15: 
  16: You should have received a copy of the GNU General Public License
  17: along with GNU Classpath; see the file COPYING.  If not, write to the
  18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  19: 02110-1301 USA.
  20: 
  21: Linking this library statically or dynamically with other modules is
  22: making a combined work based on this library.  Thus, the terms and
  23: conditions of the GNU General Public License cover the whole
  24: combination.
  25: 
  26: As a special exception, the copyright holders of this library give you
  27: permission to link this library with independent modules to produce an
  28: executable, regardless of the license terms of these independent
  29: modules, and to copy and distribute the resulting executable under
  30: terms of your choice, provided that you also meet, for each linked
  31: independent module, the terms and conditions of the license of that
  32: module.  An independent module is a module which is not derived from
  33: or based on this library.  If you modify this library, you may extend
  34: this exception to your version of the library, but you are not
  35: obligated to do so.  If you do not wish to do so, delete this
  36: exception statement from your version. */
  37: 
  38: 
  39: package gnu.java.net.protocol.http;
  40: 
  41: import java.util.ArrayList;
  42: import java.util.Date;
  43: import java.util.HashMap;
  44: import java.util.Iterator;
  45: import java.util.Map;
  46: 
  47: /**
  48:  * A simple non-persistent cookie manager. This class can be extended to
  49:  * provide cookie persistence.
  50:  *
  51:  * @author Chris Burdess (dog@gnu.org)
  52:  */
  53: public class SimpleCookieManager
  54:   implements CookieManager
  55: {
  56: 
  57:   /**
  58:    * The cookie cache.
  59:    * This is a dictionary mapping domains to maps of cookies by name.
  60:    */
  61:   protected Map<String, Map<String, Cookie>> cookies;
  62: 
  63:   /**
  64:    * Constructor.
  65:    */
  66:   public SimpleCookieManager()
  67:   {
  68:     cookies = new HashMap<String, Map<String, Cookie>>();
  69:   }
  70: 
  71:   public void setCookie(Cookie cookie)
  72:   {
  73:     String domain = cookie.getDomain();
  74:     Map<String, Cookie> map = cookies.get(domain);
  75:     if (map == null)
  76:       {
  77:         map = new HashMap<String, Cookie>();
  78:         cookies.put(domain, map);
  79:       }
  80:     String name = cookie.getName();
  81:     map.put(name, cookie); // will replace a cookie of the same name
  82:   }
  83: 
  84:   public Cookie[] getCookies(String host, boolean secure, String path)
  85:   {
  86:     ArrayList<Cookie> matches = new ArrayList<Cookie>();
  87:     Date now = new Date();
  88:     if (Character.isLetter(host.charAt(0)))
  89:       {
  90:         int di = host.indexOf('.');
  91:         while (di != -1)
  92:           {
  93:             addCookies(matches, host, secure, path, now);
  94:             host = host.substring(di);
  95:             di = host.indexOf('.', 1);
  96:           }
  97:       }
  98:     addCookies(matches, host, secure, path, now);
  99:     Cookie[] ret = new Cookie[matches.size()];
 100:     matches.toArray(ret);
 101:     return ret;
 102:   }
 103: 
 104:   private void addCookies(ArrayList<Cookie> matches, String domain,
 105:                           boolean secure, String path, Date now)
 106:   {
 107:     Map<String, Cookie> map = cookies.get(domain);
 108:     if (map != null)
 109:       {
 110:         ArrayList<String> expired = new ArrayList<String>();
 111:         for (Map.Entry<String, Cookie> entry : map.entrySet())
 112:           {
 113:             Cookie cookie = entry.getValue();
 114:             Date expires = cookie.getExpiryDate();
 115:             if (expires != null && expires.before(now))
 116:               {
 117:                 expired.add(entry.getKey());
 118:                 continue;
 119:               }
 120:             if (secure && !cookie.isSecure())
 121:               {
 122:                 continue;
 123:               }
 124:             if (path.startsWith(cookie.getPath()))
 125:               {
 126:                 matches.add(cookie);
 127:               }
 128:           }
 129:         // Good housekeeping
 130:         for (Iterator<String> i = expired.iterator(); i.hasNext(); )
 131:           {
 132:             map.remove(i.next());
 133:           }
 134:       }
 135:   }
 136: 
 137: }