Mega Code Archive

 
Categories / Java / JDK
 

Using CookieHandler in Java 5

#Code referenced from  #Chapter 6 - Extensible Markup Language (XML) #Java 6 Platform Revealed #by John Zukowski  #ISBN: 1590596609 #http://www.apress.com/book/bookDisplay.html?bID=10109 import java.io.IOException; import java.net.CookieHandler; import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; public class Fetch5 {   public static void main(String args[]) throws Exception {     String urlString = "java.sun.com";     CookieHandler.setDefault(new ListCookieHandler());     URL url = new URL(urlString);     URLConnection connection = url.openConnection();     Object obj = connection.getContent();     url = new URL(urlString);     connection = url.openConnection();     obj = connection.getContent();   } } class ListCookieHandler extends CookieHandler {   private List<Cookie> cookieJar = new LinkedList<Cookie>();   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);         for (Cookie existingCookie : cookieJar) {           if ((cookie.getURI().equals(existingCookie.getURI()))               && (cookie.getName().equals(existingCookie.getName()))) {             cookieJar.remove(existingCookie);             break;           }         }         cookieJar.add(cookie);       }     }   }   public Map<String, List<String>> get(URI uri, Map<String, List<String>> requestHeaders)       throws IOException {     StringBuilder cookies = new StringBuilder();     for (Cookie cookie : cookieJar) {       // Remove cookies that have expired       if (cookie.hasExpired()) {         cookieJar.remove(cookie);       } else if (cookie.matches(uri)) {         if (cookies.length() > 0) {           cookies.append(", ");         }         cookies.append(cookie.toString());       }     }     Map<String, List<String>> cookieMap = new HashMap<String, List<String>>(requestHeaders);     if (cookies.length() > 0) {       List<String> list = Collections.singletonList(cookies.toString());       cookieMap.put("Cookie", list);     }     System.out.println("CookieMap: " + cookieMap);     return Collections.unmodifiableMap(cookieMap);   } } class Cookie {   String name;   String value;   URI uri;   String domain;   Date expires;   String path;   private static DateFormat expiresFormat1 = new SimpleDateFormat("E, dd MMM yyyy k:m:s 'GMT'",       Locale.US);   private static DateFormat expiresFormat2 = new SimpleDateFormat("E, dd-MMM-yyyy k:m:s 'GMT'",       Locale.US);   public Cookie(URI uri, String header) {     String attributes[] = header.split(";");     String nameValue = attributes[0].trim();     this.uri = uri;     this.name = nameValue.substring(0, nameValue.indexOf('='));     this.value = nameValue.substring(nameValue.indexOf('=') + 1);     this.path = "/";     this.domain = uri.getHost();     for (int i = 1; i < attributes.length; i++) {       nameValue = attributes[i].trim();       int equals = nameValue.indexOf('=');       if (equals == -1) {         continue;       }       String name = nameValue.substring(0, equals);       String value = nameValue.substring(equals + 1);       if (name.equalsIgnoreCase("domain")) {         String uriDomain = uri.getHost();         if (uriDomain.equals(value)) {           this.domain = value;         } else {           if (!value.startsWith(".")) {             value = "." + value;           }           uriDomain = uriDomain.substring(uriDomain.indexOf('.'));           if (!uriDomain.equals(value)) {             throw new IllegalArgumentException("Trying to set foreign cookie");           }           this.domain = value;         }       } else if (name.equalsIgnoreCase("path")) {         this.path = value;       } else if (name.equalsIgnoreCase("expires")) {         try {           this.expires = expiresFormat1.parse(value);         } catch (ParseException e) {           try {             this.expires = expiresFormat2.parse(value);           } catch (ParseException e2) {             throw new IllegalArgumentException("Bad date format in header: " + value);           }         }       }     }   }   public boolean hasExpired() {     if (expires == null) {       return false;     }     Date now = new Date();     return now.after(expires);   }   public String getName() {     return name;   }   public URI getURI() {     return uri;   }   public boolean matches(URI uri) {     if (hasExpired()) {       return false;     }     String path = uri.getPath();     if (path == null) {       path = "/";     }     return path.startsWith(this.path);   }   public String toString() {     StringBuilder result = new StringBuilder(name);     result.append("=");     result.append(value);     return result.toString();   } }