diff --git a/java/org/apache/catalina/authenticator/BasicAuthenticator.java b/java/org/apache/catalina/authenticator/BasicAuthenticator.java index c293af288c3c..784698a58a98 100644 --- a/java/org/apache/catalina/authenticator/BasicAuthenticator.java +++ b/java/org/apache/catalina/authenticator/BasicAuthenticator.java @@ -197,7 +197,7 @@ public BasicCredentials(ByteChunk input, Charset charset) throws IllegalArgument public BasicCredentials(ByteChunk input, Charset charset, boolean trimCredentials) throws IllegalArgumentException { authorization = input; - initialOffset = input.getOffset(); + initialOffset = input.getStart(); this.charset = charset; this.trimCredentials = trimCredentials; @@ -249,7 +249,7 @@ private byte[] parseBase64() throws IllegalArgumentException { System.arraycopy(authorization.getBuffer(), base64blobOffset, encoded, 0, base64blobLength); byte[] decoded = Base64.getDecoder().decode(encoded); // restore original offset - authorization.setOffset(initialOffset); + authorization.setStart(initialOffset); if (decoded == null) { throw new IllegalArgumentException(sm.getString("basicAuthenticator.notBase64")); } diff --git a/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java b/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java index 6dc6d5d499ac..4678cf1326c4 100644 --- a/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java +++ b/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java @@ -163,7 +163,7 @@ protected boolean doAuthenticate(Request request, HttpServletResponse response) return false; } - authorizationBC.setOffset(authorizationBC.getOffset() + 10); + authorizationBC.setStart(authorizationBC.getStart() + 10); byte[] encoded = new byte[authorizationBC.getLength()]; System.arraycopy(authorizationBC.getBuffer(), 0, encoded, 0, authorizationBC.getLength()); diff --git a/java/org/apache/catalina/mapper/Mapper.java b/java/org/apache/catalina/mapper/Mapper.java index b46efbe382e2..e5f66b1077d5 100644 --- a/java/org/apache/catalina/mapper/Mapper.java +++ b/java/org/apache/catalina/mapper/Mapper.java @@ -713,13 +713,13 @@ private void internalMap(CharChunk host, CharChunk uri, String version, MappingD // wildcard host. This is to allow this shortcut. int firstDot = host.indexOf('.'); if (firstDot > -1) { - int offset = host.getOffset(); + int start = host.getStart(); try { - host.setOffset(firstDot + offset); + host.setStart(firstDot + start); mappedHost = exactFindIgnoreCase(hosts, host); } finally { // Make absolutely sure this gets reset - host.setOffset(offset); + host.setStart(start); } } if (mappedHost == null) { @@ -823,16 +823,16 @@ private void internalMap(CharChunk host, CharChunk uri, String version, MappingD private void internalMapWrapper(ContextVersion contextVersion, CharChunk path, MappingData mappingData) throws IOException { - int pathOffset = path.getOffset(); + int pathStart = path.getStart(); int pathEnd = path.getEnd(); boolean noServletPath = false; int length = contextVersion.path.length(); - if (length == (pathEnd - pathOffset)) { + if (length == (pathEnd - pathStart)) { noServletPath = true; } - int servletPath = pathOffset + length; - path.setOffset(servletPath); + int servletPath = pathStart + length; + path.setStart(servletPath); // Rule 1 -- Exact Match MappedWrapper[] exactWrappers = contextVersion.exactWrappers; @@ -866,7 +866,7 @@ private void internalMapWrapper(ContextVersion contextVersion, CharChunk path, M // The path is empty, redirect to "/" path.append('/'); pathEnd = path.getEnd(); - mappingData.redirectPath.setChars(path.getBuffer(), pathOffset, pathEnd - pathOffset); + mappingData.redirectPath.setChars(path.getBuffer(), pathStart, pathEnd - pathStart); path.setEnd(pathEnd - 1); return; } @@ -886,10 +886,10 @@ private void internalMapWrapper(ContextVersion contextVersion, CharChunk path, M } if (checkWelcomeFiles) { for (int i = 0; (i < contextVersion.welcomeResources.length) && (mappingData.wrapper == null); i++) { - path.setOffset(pathOffset); + path.setStart(pathStart); path.setEnd(pathEnd); path.append(contextVersion.welcomeResources[i], 0, contextVersion.welcomeResources[i].length()); - path.setOffset(servletPath); + path.setStart(servletPath); // Rule 4a -- Welcome resources processing for exact macth internalMapExactWrapper(exactWrappers, path, mappingData); @@ -917,7 +917,7 @@ private void internalMapWrapper(ContextVersion contextVersion, CharChunk path, M } } - path.setOffset(servletPath); + path.setStart(servletPath); path.setEnd(pathEnd); } @@ -936,14 +936,14 @@ private void internalMapWrapper(ContextVersion contextVersion, CharChunk path, M } if (checkWelcomeFiles) { for (int i = 0; (i < contextVersion.welcomeResources.length) && (mappingData.wrapper == null); i++) { - path.setOffset(pathOffset); + path.setStart(pathStart); path.setEnd(pathEnd); path.append(contextVersion.welcomeResources[i], 0, contextVersion.welcomeResources[i].length()); - path.setOffset(servletPath); + path.setStart(servletPath); internalMapExtensionWrapper(extensionWrappers, path, mappingData, false); } - path.setOffset(servletPath); + path.setStart(servletPath); path.setEnd(pathEnd); } } @@ -975,7 +975,7 @@ private void internalMapWrapper(ContextVersion contextVersion, CharChunk path, M // Note: this mutates the path: do not do any processing // after this (since we set the redirectPath, there // shouldn't be any) - path.setOffset(pathOffset); + path.setStart(pathStart); path.append('/'); mappingData.redirectPath.setChars(path.getBuffer(), path.getStart(), path.getLength()); } else { @@ -989,7 +989,7 @@ private void internalMapWrapper(ContextVersion contextVersion, CharChunk path, M } } - path.setOffset(pathOffset); + path.setStart(pathStart); path.setEnd(pathEnd); } @@ -1054,10 +1054,10 @@ private void internalMapWildcardWrapper(MappedWrapper[] wrappers, int nesting, C if (found) { mappingData.wrapperPath.setString(wrappers[pos].name); if (path.getLength() > length) { - mappingData.pathInfo.setChars(path.getBuffer(), path.getOffset() + length, + mappingData.pathInfo.setChars(path.getBuffer(), path.getStart() + length, path.getLength() - length); } - mappingData.requestPath.setChars(path.getBuffer(), path.getOffset(), path.getLength()); + mappingData.requestPath.setChars(path.getBuffer(), path.getStart(), path.getLength()); mappingData.wrapper = wrappers[pos].object; mappingData.jspWildCard = wrappers[pos].jspWildCard; mappingData.matchType = MappingMatch.PATH; @@ -1078,7 +1078,7 @@ private void internalMapExtensionWrapper(MappedWrapper[] wrappers, CharChunk pat boolean resourceExpected) { char[] buf = path.getBuffer(); int pathEnd = path.getEnd(); - int servletPath = path.getOffset(); + int servletPath = path.getStart(); int slash = -1; for (int i = pathEnd - 1; i >= servletPath; i--) { if (buf[i] == '/') { @@ -1095,7 +1095,7 @@ private void internalMapExtensionWrapper(MappedWrapper[] wrappers, CharChunk pat } } if (period >= 0) { - path.setOffset(period + 1); + path.setStart(period + 1); path.setEnd(pathEnd); MappedWrapper wrapper = exactFind(wrappers, path); if (wrapper != null && (resourceExpected || !wrapper.resourceOnly)) { @@ -1104,7 +1104,7 @@ private void internalMapExtensionWrapper(MappedWrapper[] wrappers, CharChunk pat mappingData.wrapper = wrapper.object; mappingData.matchType = MappingMatch.EXTENSION; } - path.setOffset(servletPath); + path.setStart(servletPath); path.setEnd(pathEnd); } } diff --git a/java/org/apache/coyote/ajp/AjpMessage.java b/java/org/apache/coyote/ajp/AjpMessage.java index c20f4a26c516..04e99aab9f7e 100644 --- a/java/org/apache/coyote/ajp/AjpMessage.java +++ b/java/org/apache/coyote/ajp/AjpMessage.java @@ -167,7 +167,7 @@ public void appendBytes(MessageBytes mb) { // values will be OK. Strings using other encodings may be // corrupted. byte[] buffer = bc.getBuffer(); - for (int i = bc.getOffset(); i < bc.getLength(); i++) { + for (int i = bc.getStart(); i < bc.getLength(); i++) { // byte values are signed i.e. -128 to 127 // The values are used unsigned. 0 to 31 are CTLs so they are // filtered (apart from TAB which is 9). 127 is a control (DEL). diff --git a/java/org/apache/coyote/ajp/AjpProcessor.java b/java/org/apache/coyote/ajp/AjpProcessor.java index e21ae7b39010..6e81bffb6832 100644 --- a/java/org/apache/coyote/ajp/AjpProcessor.java +++ b/java/org/apache/coyote/ajp/AjpProcessor.java @@ -713,7 +713,7 @@ private void prepareRequest() { } else if (hId == Constants.SC_REQ_CONTENT_TYPE || (hId == -1 && tmpMB.equalsIgnoreCase("Content-Type"))) { // just read the content-type header, so set it ByteChunk bchunk = vMB.getByteChunk(); - request.contentType().setBytes(bchunk.getBytes(), bchunk.getOffset(), bchunk.getLength()); + request.contentType().setBytes(bchunk.getBytes(), bchunk.getStart(), bchunk.getLength()); } } diff --git a/java/org/apache/coyote/http11/Http11OutputBuffer.java b/java/org/apache/coyote/http11/Http11OutputBuffer.java index bcdc89c9c619..128f327cdb9d 100644 --- a/java/org/apache/coyote/http11/Http11OutputBuffer.java +++ b/java/org/apache/coyote/http11/Http11OutputBuffer.java @@ -388,7 +388,7 @@ private void write(MessageBytes mb) { // values will be OK. Strings using other encodings may be // corrupted. byte[] buffer = bc.getBuffer(); - for (int i = bc.getOffset(); i < bc.getLength(); i++) { + for (int i = bc.getStart(); i < bc.getLength(); i++) { // byte values are signed i.e. -128 to 127 // The values are used unsigned. 0 to 31 are CTLs so they are // filtered (apart from TAB which is 9). 127 is a control (DEL). diff --git a/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java b/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java index fb3b8638ebaf..a10063005b3e 100644 --- a/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java +++ b/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java @@ -46,7 +46,7 @@ public SavedRequestInputFilter(ByteChunk input) { @Override public int doRead(ApplicationBufferHandler handler) throws IOException { - if(input.getOffset()>= input.getEnd()) { + if(input.getStart()>= input.getEnd()) { return -1; } @@ -104,6 +104,6 @@ public long end() throws IOException { @Override public boolean isFinished() { - return input.getOffset() >= input.getEnd(); + return input.getStart() >= input.getEnd(); } } diff --git a/java/org/apache/coyote/http2/Stream.java b/java/org/apache/coyote/http2/Stream.java index 6d705e20b1d0..a357d34cf727 100644 --- a/java/org/apache/coyote/http2/Stream.java +++ b/java/org/apache/coyote/http2/Stream.java @@ -1362,7 +1362,7 @@ final ByteBuffer getInBuffer() { final void insertReplayedBody(ByteChunk body) { readStateLock.lock(); try { - inBuffer = ByteBuffer.wrap(body.getBytes(), body.getOffset(), body.getLength()); + inBuffer = ByteBuffer.wrap(body.getBytes(), body.getStart(), body.getLength()); } finally { readStateLock.unlock(); } diff --git a/java/org/apache/tomcat/util/buf/AbstractChunk.java b/java/org/apache/tomcat/util/buf/AbstractChunk.java index 3e06362f5f4b..41d207a08c7c 100644 --- a/java/org/apache/tomcat/util/buf/AbstractChunk.java +++ b/java/org/apache/tomcat/util/buf/AbstractChunk.java @@ -58,6 +58,9 @@ public void setLimit(int limit) { } + /** + * @return the maximum amount of data in the buffer, and -1 if it has not been set + */ public int getLimit() { return limit; } @@ -80,23 +83,50 @@ public int getStart() { } + /** + * Set the start position of the data in the buffer. + * @param start the new start position + */ + public void setStart(int start) { + if (end < start) { + end = start; + } + this.start = start; + } + + + /** + * @return the end position of the data in the buffer + */ public int getEnd() { return end; } - public void setEnd(int i) { - end = i; + /** + * Set the end position of the data in the buffer. + * @param end the new end position + */ + public void setEnd(int end) { + this.end = end; } - // TODO: Deprecate offset and use start - + /** + * @return start + * @deprecated Unused. This method will be removed in Tomcat 12. + */ + @Deprecated public int getOffset() { return start; } - + /** + * Set start. + * @param off the new start + * @deprecated Unused. This method will be removed in Tomcat 12. + */ + @Deprecated public void setOffset(int off) { if (end < off) { end = off; @@ -113,6 +143,9 @@ public int getLength() { } + /** + * @return {@code true} if the buffer contains no data + */ public boolean isNull() { if (end > 0) { return false; @@ -121,19 +154,30 @@ public boolean isNull() { } - public int indexOf(String src, int srcOff, int srcLen, int myOff) { - char first = src.charAt(srcOff); + /** + * Return the index of the first occurrence of the subsequence of + * the given String, or -1 if it is not found. + * + * @param src the String to look for + * @param srcStart the subsequence start in the String + * @param srcLen the subsequence length in the String + * @param myOffset the index on which to start the search in the buffer + * @return the position of the first character of the first occurrence + * of the subsequence in the buffer, or -1 if not found + */ + public int indexOf(String src, int srcStart, int srcLen, int myOffset) { + char first = src.charAt(srcStart); // Look for first char - int srcEnd = srcOff + srcLen; + int srcEnd = srcStart + srcLen; - mainLoop: for (int i = myOff + start; i <= (end - srcLen); i++) { + mainLoop: for (int i = myOffset + start; i <= (end - srcLen); i++) { if (getBufferElement(i) != first) { continue; } // found first char, now look for a match int myPos = i + 1; - for (int srcPos = srcOff + 1; srcPos < srcEnd;) { + for (int srcPos = srcStart + 1; srcPos < srcEnd;) { if (getBufferElement(myPos++) != src.charAt(srcPos++)) { continue mainLoop; } @@ -169,6 +213,9 @@ public int hashCode() { } + /** + * @return the hash code for this buffer + */ public int hash() { int code = 0; for (int i = start; i < end; i++) { @@ -178,5 +225,9 @@ public int hash() { } + /** + * @param index the element location in the buffer + * @return the element + */ protected abstract int getBufferElement(int index); } diff --git a/java/org/apache/tomcat/util/buf/B2CConverter.java b/java/org/apache/tomcat/util/buf/B2CConverter.java index 0e9db1781394..df31c1c394d1 100644 --- a/java/org/apache/tomcat/util/buf/B2CConverter.java +++ b/java/org/apache/tomcat/util/buf/B2CConverter.java @@ -169,11 +169,11 @@ public void convert(ByteChunk bc, CharChunk cc, boolean endOfInput) throws IOExc } else if (result.isOverflow()) { // Propagate current positions to the byte chunk and char chunk, if // this continues the char buffer will get resized - bc.setOffset(bb.position()); + bc.setStart(bb.position()); cc.setEnd(cb.position()); } else if (result.isUnderflow()) { // Propagate current positions to the byte chunk and char chunk - bc.setOffset(bb.position()); + bc.setStart(bb.position()); cc.setEnd(cb.position()); // Put leftovers in the leftovers byte buffer if (bc.getLength() > 0) { diff --git a/java/org/apache/tomcat/util/buf/C2BConverter.java b/java/org/apache/tomcat/util/buf/C2BConverter.java index 9c0c34b4c47f..2e3db2b5262a 100644 --- a/java/org/apache/tomcat/util/buf/C2BConverter.java +++ b/java/org/apache/tomcat/util/buf/C2BConverter.java @@ -121,11 +121,11 @@ public void convert(CharChunk cc, ByteChunk bc) throws IOException { } else if (result.isOverflow()) { // Propagate current positions to the byte chunk and char chunk bc.setEnd(bb.position()); - cc.setOffset(cb.position()); + cc.setStart(cb.position()); } else if (result.isUnderflow()) { // Propagate current positions to the byte chunk and char chunk bc.setEnd(bb.position()); - cc.setOffset(cb.position()); + cc.setStart(cb.position()); // Put leftovers in the leftovers char buffer if (cc.getLength() > 0) { leftovers.limit(leftovers.array().length); diff --git a/java/org/apache/tomcat/util/buf/CharChunk.java b/java/org/apache/tomcat/util/buf/CharChunk.java index fc0a5753d102..e530ab5c7320 100644 --- a/java/org/apache/tomcat/util/buf/CharChunk.java +++ b/java/org/apache/tomcat/util/buf/CharChunk.java @@ -175,7 +175,7 @@ public void append(char c) throws IOException { public void append(CharChunk src) throws IOException { - append(src.getBuffer(), src.getOffset(), src.getLength()); + append(src.getBuffer(), src.getStart(), src.getLength()); } @@ -484,7 +484,7 @@ public boolean equalsIgnoreCase(String s) { public boolean equals(CharChunk cc) { - return equals(cc.getChars(), cc.getOffset(), cc.getLength()); + return equals(cc.getChars(), cc.getStart(), cc.getLength()); } @@ -648,7 +648,7 @@ public char charAt(int index) { public CharSequence subSequence(int start, int end) { try { CharChunk result = (CharChunk) this.clone(); - result.setOffset(this.start + start); + result.setStart(this.start + start); result.setEnd(this.start + end); return result; } catch (CloneNotSupportedException e) { diff --git a/java/org/apache/tomcat/util/buf/MessageBytes.java b/java/org/apache/tomcat/util/buf/MessageBytes.java index 70ac7d9bfe89..528c0be0af97 100644 --- a/java/org/apache/tomcat/util/buf/MessageBytes.java +++ b/java/org/apache/tomcat/util/buf/MessageBytes.java @@ -598,7 +598,7 @@ public void setLong(long l) { current = current / 10; buf[end++] = HexUtils.getHex(digit); } - byteC.setOffset(0); + byteC.setStart(0); byteC.setEnd(end); // Inverting buffer end--; diff --git a/java/org/apache/tomcat/util/buf/UDecoder.java b/java/org/apache/tomcat/util/buf/UDecoder.java index 937b441fc319..42f08f6ed605 100644 --- a/java/org/apache/tomcat/util/buf/UDecoder.java +++ b/java/org/apache/tomcat/util/buf/UDecoder.java @@ -98,7 +98,7 @@ public void convert(ByteChunk mb, EncodedSolidusHandling encodedSolidusHandling) private void convert(ByteChunk mb, boolean query, EncodedSolidusHandling encodedSolidusHandling) throws IOException { - int start = mb.getOffset(); + int start = mb.getStart(); byte buff[] = mb.getBytes(); int end = mb.getEnd(); diff --git a/java/org/apache/tomcat/util/http/Parameters.java b/java/org/apache/tomcat/util/http/Parameters.java index 31b8abedbba8..8e638f68ce1e 100644 --- a/java/org/apache/tomcat/util/http/Parameters.java +++ b/java/org/apache/tomcat/util/http/Parameters.java @@ -478,7 +478,7 @@ public void processParameters(MessageBytes data, Charset charset) { data.toBytes(); } ByteChunk bc = data.getByteChunk(); - processParameters(bc.getBytes(), bc.getOffset(), bc.getLength(), charset); + processParameters(bc.getBytes(), bc.getStart(), bc.getLength(), charset); } /** diff --git a/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java b/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java index 3c46926df014..990d531d3eec 100644 --- a/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java +++ b/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java @@ -88,7 +88,7 @@ public void parseCookieHeader(MimeHeaders headers, ServerCookies serverCookies) } ByteChunk bc = cookieValue.getByteChunk(); - Cookie.parseCookie(bc.getBytes(), bc.getOffset(), bc.getLength(), serverCookies); + Cookie.parseCookie(bc.getBytes(), bc.getStart(), bc.getLength(), serverCookies); } // search from the next position diff --git a/java/org/apache/tomcat/util/http/parser/Host.java b/java/org/apache/tomcat/util/http/parser/Host.java index f9cb602bfe43..06415c6f014b 100644 --- a/java/org/apache/tomcat/util/http/parser/Host.java +++ b/java/org/apache/tomcat/util/http/parser/Host.java @@ -90,7 +90,7 @@ private static class MessageBytesReader extends Reader { MessageBytesReader(MessageBytes mb) { ByteChunk bc = mb.getByteChunk(); bytes = bc.getBytes(); - pos = bc.getOffset(); + pos = bc.getStart(); end = bc.getEnd(); } diff --git a/test/org/apache/catalina/authenticator/TestBasicAuthParser.java b/test/org/apache/catalina/authenticator/TestBasicAuthParser.java index 03d91ba250dd..0e0d9cac4d9f 100644 --- a/test/org/apache/catalina/authenticator/TestBasicAuthParser.java +++ b/test/org/apache/catalina/authenticator/TestBasicAuthParser.java @@ -486,7 +486,7 @@ private BasicAuthHeader(String method, String username, + ioe.getMessage()); } // emulate tomcat server - offset points to method in header - authHeader.setOffset(initialOffset); + authHeader.setStart(initialOffset); } /* @@ -506,7 +506,7 @@ private BasicAuthHeader(String method, String fakeBase64) { + ioe.getMessage()); } // emulate tomcat server - offset points to method in header - authHeader.setOffset(initialOffset); + authHeader.setStart(initialOffset); } /*