costin 01/12/31 10:20:05 Modified: util/java/org/apache/tomcat/util/buf Base64.java ByteChunk.java DateTool.java HexUtils.java MessageBytes.java TimeStamp.java UDecoder.java UEncoder.java util/java/org/apache/tomcat/util/collections LRUCache.java SimpleHashtable.java SimplePool.java util/java/org/apache/tomcat/util/http Cookies.java MimeHeaders.java Parameters.java ServerCookie.java Log: Synchronize utils with 3.3 release. Revision Changes Path 1.2 +1 -5 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/Base64.java Index: Base64.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/Base64.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- Base64.java 16 May 2001 23:17:55 -0000 1.1 +++ Base64.java 31 Dec 2001 18:20:04 -0000 1.2 @@ -1,8 +1,4 @@ /* - * $Header: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/Base64.java,v 1.1 2001/05/16 23:17:55 seguin Exp $ - * $Revision: 1.1 $ - * $Date: 2001/05/16 23:17:55 $ - * * ==================================================================== * * The Apache Software License, Version 1.1 @@ -74,7 +70,7 @@ * This class is used by XML Schema binary format validation * * @author Jeffrey Rodriguez - * @version $Revision: 1.1 $ $Date: 2001/05/16 23:17:55 $ + * @version $Revision: 1.2 $ $Date: 2001/12/31 18:20:04 $ */ public final class Base64 { 1.5 +1 -1 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/ByteChunk.java Index: ByteChunk.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/ByteChunk.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- ByteChunk.java 20 Jun 2001 05:24:47 -0000 1.4 +++ ByteChunk.java 31 Dec 2001 18:20:04 -0000 1.5 @@ -586,7 +586,7 @@ } return -1; } - + // -------------------- Hash code -------------------- // normal hash. 1.4 +41 -24 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/DateTool.java Index: DateTool.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/DateTool.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- DateTool.java 9 Jun 2001 00:12:51 -0000 1.3 +++ DateTool.java 31 Dec 2001 18:20:04 -0000 1.4 @@ -84,19 +84,19 @@ /** GMT timezone - all HTTP dates are on GMT */ - private final static TimeZone GMT_ZONE = TimeZone.getTimeZone("GMT"); + public final static TimeZone GMT_ZONE = TimeZone.getTimeZone("GMT"); /** format for RFC 1123 date string -- "Sun, 06 Nov 1994 08:49:37 GMT" */ - private final static String RFC1123_PATTERN = + public final static String RFC1123_PATTERN = "EEE, dd MMM yyyy HH:mm:ss z"; // format for RFC 1036 date string -- "Sunday, 06-Nov-94 08:49:37 GMT" - private final static String rfc1036Pattern = + public final static String rfc1036Pattern = "EEEEEEEEE, dd-MMM-yy HH:mm:ss z"; // format for C asctime() date string -- "Sun Nov 6 08:49:37 1994" - private final static String asctimePattern = + public final static String asctimePattern = "EEE MMM d HH:mm:ss yyyy"; /** Pattern used for old cookies @@ -127,6 +127,9 @@ asctimeFormat.setTimeZone(GMT_ZONE); } + private static String rfc1123DS; + private static long rfc1123Sec; + private static StringManager sm = StringManager.getManager("org.apache.tomcat.util.buf.res"); @@ -139,7 +142,21 @@ /** */ public static String format1123( Date d ) { - return rfc1123Format.format( d ); + long dt = d.getTime() % 1000; + if ((rfc1123DS != null) && (dt == rfc1123Sec)) + return rfc1123DS; + rfc1123DS = rfc1123Format.format( d ); + rfc1123Sec = dt; + return rfc1123DS; + } + + public static String format1123( Date d,DateFormat df ) { + long dt = d.getTime() % 1000; + if ((rfc1123DS != null) && (dt == rfc1123Sec)) + return rfc1123DS; + rfc1123DS = df.format( d ); + rfc1123Sec = dt; + return rfc1123DS; } @@ -149,13 +166,19 @@ public static void formatOldCookie( Date d, StringBuffer sb, FieldPosition fp ) { - oldCookieFormat.format( d, sb, fp ); + synchronized(oldCookieFormat) { + oldCookieFormat.format( d, sb, fp ); + } } // Called from ServerCookie public static String formatOldCookie( Date d ) { - return oldCookieFormat.format( d ); + String ocf=null; + synchronized(oldCookieFormat) { + ocf= oldCookieFormat.format( d ); + } + return ocf; } @@ -163,24 +186,18 @@ Not efficient - but not very used. */ public static long parseDate( String dateString ) { + DateFormat [] format = {rfc1123Format,rfc1036Format,asctimeFormat}; + return parseDate(dateString,format); + } + public static long parseDate( String dateString, DateFormat []format ) { Date date=null; - try { - date = DateTool.rfc1123Format.parse(dateString); - return date.getTime(); - } catch (ParseException e) { } - catch (StringIndexOutOfBoundsException e) { } - - try { - date = DateTool.rfc1036Format.parse(dateString); - return date.getTime(); - } catch (ParseException e) { } - catch (StringIndexOutOfBoundsException e) { } - - try { - date = DateTool.asctimeFormat.parse(dateString); - return date.getTime(); - } catch (ParseException pe) { } - catch (StringIndexOutOfBoundsException e) { } + for(int i=0; i < format.length; i++) { + try { + date = format[i].parse(dateString); + return date.getTime(); + } catch (ParseException e) { } + catch (StringIndexOutOfBoundsException e) { } + } String msg = sm.getString("httpDate.pe", dateString); throw new IllegalArgumentException(msg); } 1.4 +0 -4 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/HexUtils.java Index: HexUtils.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/HexUtils.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- HexUtils.java 9 Jun 2001 00:12:51 -0000 1.3 +++ HexUtils.java 31 Dec 2001 18:20:04 -0000 1.4 @@ -1,8 +1,4 @@ /* - * $Header: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/HexUtils.java,v 1.3 2001/06/09 00:12:51 costin Exp $ - * $Revision: 1.3 $ - * $Date: 2001/06/09 00:12:51 $ - * * ==================================================================== * * The Apache Software License, Version 1.1 1.6 +30 -3 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/MessageBytes.java Index: MessageBytes.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/MessageBytes.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- MessageBytes.java 21 Jun 2001 21:22:09 -0000 1.5 +++ MessageBytes.java 31 Dec 2001 18:20:04 -0000 1.6 @@ -99,6 +99,10 @@ public MessageBytes() { } + public static MessageBytes newInstance() { + return factory.newInstance(); + } + public void setCaseSenitive( boolean b ) { caseSensitive=b; } @@ -499,21 +503,29 @@ /** * @deprecated The buffer are general purpose, caching for headers should - * be done in headers + * be done in headers. The second parameter allows us to pass a date format + * instance to avoid synchronization problems. */ - public void setTime(long t) { + public void setTime(long t, DateFormat df) { // XXX replace it with a byte[] tool recycle(); if( dateValue==null) dateValue=new Date(t); else dateValue.setTime(t); - strValue=DateTool.format1123(dateValue); + if( df==null ) + strValue=DateTool.format1123(dateValue); + else + strValue=DateTool.format1123(dateValue,df); hasStrValue=true; hasDateValue=true; type=T_STR; } + public void setTime(long t) { + setTime( t, null ); + } + /** Set the buffer to the representation of an int * @deprecated The buffer are general purpose, caching for headers should * be done in headers @@ -570,5 +582,20 @@ hasIntValue=true; return intValue; } + + // -------------------- Future may be different -------------------- + + private static MessageBytesFactory factory=new MessageBytesFactory(); + + public static void setFactory( MessageBytesFactory mbf ) { + factory=mbf; + } + public static class MessageBytesFactory { + protected MessageBytesFactory() { + } + public MessageBytes newInstance() { + return new MessageBytes(); + } + } } 1.3 +1 -1 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/TimeStamp.java Index: TimeStamp.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/TimeStamp.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- TimeStamp.java 29 May 2001 06:22:53 -0000 1.2 +++ TimeStamp.java 31 Dec 2001 18:20:04 -0000 1.3 @@ -115,7 +115,7 @@ * The name is a MessageBytes - i.e. a modifiable byte[] or char[]. */ public MessageBytes getName() { - if( name==null ) name=new MessageBytes();//lazy + if( name==null ) name=MessageBytes.newInstance();//lazy return name; } 1.4 +1 -0 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/UDecoder.java Index: UDecoder.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/UDecoder.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- UDecoder.java 20 Jun 2001 05:24:47 -0000 1.3 +++ UDecoder.java 31 Dec 2001 18:20:04 -0000 1.4 @@ -143,6 +143,7 @@ } if( idx2 >= 0 && idx2 < idx ) idx=idx2; + if( idx < 0 ) idx=idx2; for( int j=idx; j<cend; j++, idx++ ) { if( buff[ j ] == '+' ) { 1.2 +18 -2 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/UEncoder.java Index: UEncoder.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/UEncoder.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- UEncoder.java 29 May 2001 06:22:53 -0000 1.1 +++ UEncoder.java 31 Dec 2001 18:20:04 -0000 1.2 @@ -158,8 +158,24 @@ buf.write(ch); } } - - + + /** + * Utility funtion to re-encode the URL. + * Still has problems with charset, since UEncoder mostly + * ignores it. + */ + public String encodeURL(String uri) { + String outUri=null; + try { + // XXX optimize - recycle, etc + CharArrayWriter out = new CharArrayWriter(); + urlEncode(out, uri); + outUri=out.toString(); + } catch (IOException iex) { + } + return outUri; + } + // -------------------- Internal implementation -------------------- 1.2 +0 -4 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/collections/LRUCache.java Index: LRUCache.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/collections/LRUCache.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- LRUCache.java 16 May 2001 23:18:02 -0000 1.1 +++ LRUCache.java 31 Dec 2001 18:20:04 -0000 1.2 @@ -1,8 +1,4 @@ /* - * $Header: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/collections/LRUCache.java,v 1.1 2001/05/16 23:18:02 seguin Exp $ - * $Revision: 1.1 $ - * $Date: 2001/05/16 23:18:02 $ - * * ==================================================================== * * The Apache Software License, Version 1.1 1.2 +18 -5 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/collections/SimpleHashtable.java Index: SimpleHashtable.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/collections/SimpleHashtable.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SimpleHashtable.java 16 May 2001 23:18:05 -0000 1.1 +++ SimpleHashtable.java 31 Dec 2001 18:20:04 -0000 1.2 @@ -97,7 +97,6 @@ * it makes a significant difference when normalizing attributes, * which is done for each start-element construct. * - * @version $Revision: 1.1 $ */ public final class SimpleHashtable implements Enumeration { @@ -108,6 +107,7 @@ private Entry current = null; private int currentBucket = 0; + // number of elements in hashtable private int count; private int threshold; @@ -166,6 +166,7 @@ public Enumeration keys() { currentBucket = 0; current = null; + hasMoreElements(); return this; } @@ -197,6 +198,9 @@ throw new IllegalStateException (); retval = current.key; current = current.next; + // Advance to the next position ( we may call next after next, + // without hasMore ) + hasMoreElements(); return retval; } @@ -313,18 +317,22 @@ Entry prev=null; int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length; + if( dL > 0 ) d("Idx " + index + " " + tab[index] ); for (Entry e = tab[index] ; e != null ; prev=e, e = e.next) { + if( dL > 0 ) d("> " + prev + " " + e.next + " " + e + " " + e.key); if ((e.hash == hash) && e.key.equals(key)) { if( prev!=null ) { prev.next=e.next; } else { tab[index]=e.next; } + if( dL > 0 ) d("Removing from list " + tab[index] + " " + prev + + " " + e.value); + count--; + Object res=e.value; + e.value=null; + return res; } - count--; - Object res=e.value; - e.value=null; - return res; } return null; } @@ -344,5 +352,10 @@ this.value = value; this.next = next; } + } + + private static final int dL=0; + private void d(String s ) { + System.err.println( "SimpleHashtable: " + s ); } } 1.2 +1 -0 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/collections/SimplePool.java Index: SimplePool.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/collections/SimplePool.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SimplePool.java 16 May 2001 23:18:05 -0000 1.1 +++ SimplePool.java 31 Dec 2001 18:20:04 -0000 1.2 @@ -131,6 +131,7 @@ synchronized( lock ) { if( current >= 0 ) { item = pool[current]; + pool[current] = null; current -= 1; } if( debug > 0 ) 1.2 +1 -1 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http/Cookies.java Index: Cookies.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http/Cookies.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- Cookies.java 16 May 2001 23:18:10 -0000 1.1 +++ Cookies.java 31 Dec 2001 18:20:05 -0000 1.2 @@ -357,7 +357,7 @@ { while( off < end ) { byte b=bytes[off]; - if( b==' ' || b==';' || b==',' ) + if( b==';' || b==',' ) return off; off++; } 1.2 +2 -2 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http/MimeHeaders.java Index: MimeHeaders.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http/MimeHeaders.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- MimeHeaders.java 16 May 2001 23:18:12 -0000 1.1 +++ MimeHeaders.java 31 Dec 2001 18:20:05 -0000 1.2 @@ -451,8 +451,8 @@ MimeHeaderField next; MimeHeaderField prev; - protected final MessageBytes nameB = new MessageBytes(); - protected final MessageBytes valueB = new MessageBytes(); + protected final MessageBytes nameB = MessageBytes.newInstance(); + protected final MessageBytes valueB = MessageBytes.newInstance(); /** * Creates a new, uninitialized header field. 1.6 +67 -15 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http/Parameters.java Index: Parameters.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http/Parameters.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- Parameters.java 21 Jun 2001 04:38:13 -0000 1.5 +++ Parameters.java 31 Dec 2001 18:20:05 -0000 1.6 @@ -82,7 +82,7 @@ MimeHeaders headers; UDecoder urlDec; - MessageBytes decodedQuery=new MessageBytes(); + MessageBytes decodedQuery=MessageBytes.newInstance(); public static final int INITIAL_SIZE=4; @@ -317,6 +317,7 @@ // incredibly inefficient data representation for parameters, // until we test the new one private void addParam( String key, String value ) { + if( key==null ) return; String values[]; if (paramHashStringArray.containsKey(key)) { String oldValues[] = (String[])paramHashStringArray. @@ -359,13 +360,30 @@ log( "Bytes: " + new String( bytes, start, len )); do { + boolean noEq=false; + int valStart=-1; + int valEnd=-1; + int nameStart=pos; int nameEnd=ByteChunk.indexOf(bytes, nameStart, end, '=' ); - if( nameEnd== -1 ) nameEnd=end; - - int valStart=nameEnd+1; - int valEnd=ByteChunk.indexOf(bytes, valStart, end, '&'); - if( valEnd== -1 ) valEnd = (valStart < end) ? end : valStart; + // Workaround for a&b&c encoding + int nameEnd2=ByteChunk.indexOf(bytes, nameStart, end, '&' ); + if( (nameEnd2!=-1 ) && + ( nameEnd==-1 || nameEnd > nameEnd2) ) { + nameEnd=nameEnd2; + noEq=true; + valStart=nameEnd; + valEnd=nameEnd; + if( debug>0) log("no equal " + nameStart + " " + nameEnd + " " + new String(bytes, nameStart, nameEnd-nameStart) ); + } + if( nameEnd== -1 ) + nameEnd=end; + + if( ! noEq ) { + valStart=nameEnd+1; + valEnd=ByteChunk.indexOf(bytes, valStart, end, '&'); + if( valEnd== -1 ) valEnd = (valStart < end) ? end : valStart; + } pos=valEnd+1; @@ -381,7 +399,7 @@ try { if( debug > 0 ) - log( tmpName + "= " + tmpValue); + log( "Found " + tmpName + "= " + tmpValue); if( urlDec==null ) { urlDec=new UDecoder(); @@ -390,7 +408,7 @@ urlDec.convert( tmpValue ); if( debug > 0 ) - log( tmpName + "= " + tmpValue); + log( "After url decoding " + tmpName + "= " + tmpValue); addParam( tmpName.toString(), tmpValue.toString() ); } catch( IOException ex ) { @@ -410,13 +428,29 @@ if( debug>0 ) log( "Chars: " + new String( chars, start, len )); do { + boolean noEq=false; int nameStart=pos; + int valStart=-1; + int valEnd=-1; + int nameEnd=CharChunk.indexOf(chars, nameStart, end, '=' ); + int nameEnd2=CharChunk.indexOf(chars, nameStart, end, '&' ); + if( (nameEnd2!=-1 ) && + ( nameEnd==-1 || nameEnd > nameEnd2) ) { + nameEnd=nameEnd2; + noEq=true; + valStart=nameEnd; + valEnd=nameEnd; + if( debug>0) log("no equal " + nameStart + " " + nameEnd + " " + new String(chars, nameStart, nameEnd-nameStart) ); + } if( nameEnd== -1 ) nameEnd=end; - - int valStart=nameEnd+1; - int valEnd=CharChunk.indexOf(chars, valStart, end, '&'); - if( valEnd== -1 ) valEnd = (valStart < end) ? end : valStart; + + if( ! noEq ) { + valStart=nameEnd+1; + valEnd=CharChunk.indexOf(chars, valStart, end, '&'); + if( valEnd== -1 ) valEnd = (valStart < end) ? end : valStart; + } + pos=valEnd+1; if( nameEnd<=nameStart ) { @@ -501,13 +535,31 @@ log("String: " + str ); do { + boolean noEq=false; + int valStart=-1; + int valEnd=-1; + int nameStart=pos; int nameEnd=str.indexOf('=', nameStart ); + int nameEnd2=str.indexOf('&', nameStart ); + if( nameEnd2== -1 ) nameEnd2=end; + if( (nameEnd2!=-1 ) && + ( nameEnd==-1 || nameEnd > nameEnd2) ) { + nameEnd=nameEnd2; + noEq=true; + valStart=nameEnd; + valEnd=nameEnd; + if( debug>0) log("no equal " + nameStart + " " + nameEnd + " " + str.substring(nameStart, nameEnd) ); + } + if( nameEnd== -1 ) nameEnd=end; - int valStart=nameEnd+1; - int valEnd=str.indexOf('&', valStart); - if( valEnd== -1 ) valEnd = (valStart < end) ? end : valStart; + if( ! noEq ) { + valStart=nameEnd+1; + valEnd=str.indexOf('&', valStart); + if( valEnd== -1 ) valEnd = (valStart < end) ? end : valStart; + } + pos=valEnd+1; if( nameEnd<=nameStart ) { 1.3 +5 -5 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http/ServerCookie.java Index: ServerCookie.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http/ServerCookie.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ServerCookie.java 29 May 2001 06:22:54 -0000 1.2 +++ ServerCookie.java 31 Dec 2001 18:20:05 -0000 1.3 @@ -72,16 +72,16 @@ * and the facade will convert it to the external representation. */ public class ServerCookie implements Serializable { - private MessageBytes name=new MessageBytes(); - private MessageBytes value=new MessageBytes(); + private MessageBytes name=MessageBytes.newInstance(); + private MessageBytes value=MessageBytes.newInstance(); - private MessageBytes comment=new MessageBytes(); // ;Comment=VALUE - private MessageBytes domain=new MessageBytes(); // ;Domain=VALUE ... + private MessageBytes comment=MessageBytes.newInstance(); // ;Comment=VALUE + private MessageBytes domain=MessageBytes.newInstance(); // ;Domain=VALUE ... private int maxAge = -1; // ;Max-Age=VALUE // ;Discard ... implied by maxAge < 0 // RFC2109: maxAge=0 will end a session - private MessageBytes path=new MessageBytes(); // ;Path=VALUE . + private MessageBytes path=MessageBytes.newInstance(); // ;Path=VALUE . private boolean secure; // ;Secure private int version = 0; // ;Version=1
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>