001 /*
002 * Copyright 1999,2004 The Apache Software Foundation.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package org.apache.commons.feedparser.network;
018
019 import java.util.Enumeration;
020 import java.util.Hashtable;
021
022 /**
023 *
024 * By default java.net.URL does NOT handle cookies. This is a simple extension
025 * that allows us to persist cookies in the VM during runtime.
026 *
027 * FIXME: How can we make sure to delete older sites...?! no need for this to
028 * grow to infinite size.
029 *
030 * @author <a href="mailto:burton@peerfear.org">Kevin A. Burton</a>
031 */
032 public class URLCookieManager {
033
034 static Hashtable cookies = new Hashtable();
035
036 /**
037 * Get the cookies for a site. When none are available return null.
038 *
039 *
040 */
041 public static Hashtable getCookies( String site ) {
042
043 return (Hashtable)cookies.get( site );
044
045 }
046
047 /**
048 * Add cookies to this request and perform any other init.
049 *
050 *
051 */
052 public static void init( ResourceRequest request ) {
053
054 String site = getSite( request );
055
056 Hashtable cookies = getCookies( site );
057
058 if ( cookies == null )
059 return;
060
061 String header = getCookiesHeader( cookies );
062
063 request.setRequestHeaderField( "Cookies", header );
064
065 }
066
067 public static String getSite( ResourceRequest request ) {
068
069 String resource = request.getResource();
070
071 int end = resource.indexOf( "://" );
072 end = resource.indexOf( "/", end );
073
074 if ( end == -1 )
075 end = resource.length();
076
077 return resource.substring( 0, end );
078
079 }
080
081 /**
082 * Save the cookies FROM this request.
083 *
084 *
085 */
086 public static void save( ResourceRequest request ) {
087
088 String header = request.getHeaderField( "Set-Cookie" );
089
090 Hashtable cookies = parseCookieHeader( header );
091
092 String site = getSite( request );
093
094 //FIXME: merge these... new cookies into the site cookies
095
096 }
097
098 /**
099 * Parse a given Cookie header into a hashtable.
100 *
101 *
102 */
103 public static String getCookiesHeader( Hashtable cookies ) {
104
105 Enumeration keys = cookies.keys();
106
107 StringBuffer buff = new StringBuffer( 1024 );
108
109 while ( keys.hasMoreElements() ) {
110
111 String name = (String)keys.nextElement();
112 String value = (String)cookies.get( name );
113
114 if ( buff.length() > 0 )
115 buff.append( "; " );
116
117 buff.append( name );
118 buff.append( "=" );
119 buff.append( value );
120
121 }
122
123 return buff.toString();
124
125 }
126
127 /**
128 * Parse a given Cookie header into a hashtable.
129 *
130 *
131 */
132 public static Hashtable parseCookieHeader( String header ) {
133
134 //this is a simple format and easy to parse
135
136 //Cookie: password=HvS11dffnlD50bOLZYgG4oZFA-U
137
138 /**
139 * Where should we read the cookie name from
140 */
141 int begin = 0;
142
143 /**
144 * Where do we spit into the variable
145 */
146 int split = 0;
147
148 /**
149 * Where is the end of the cookie.
150 */
151 int end = 0;
152
153 Hashtable result = new Hashtable();
154
155 while ( (split = header.indexOf( "=", begin )) != -1 ) {
156
157 end = header.indexOf( ";", split );
158
159 if ( end == -1 )
160 end = header.length();
161
162 String name = header.substring( begin, split );
163 String value = header.substring( split+1, end );
164
165 //move to the next one.
166 begin = end + 2;
167
168 result.put( name, value );
169
170 }
171
172 return result;
173
174 }
175
176 public static void main( String[] args ) {
177
178 parseCookieHeader( "password=HvS11dffnlD50bOLZYgG4oZFA-U; username=burtonator; rojoWeb=12.43.53.196.1091730560640949; JSESSIONID=B1245A7FEB43537E994324A157330F3A" );
179
180 }
181
182 }