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(); |
} |
} |