This is an automated email from the ASF dual-hosted git repository. remm pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push: new 1bd08df1a8 Deprecate offset, as mentioned in the todo 1bd08df1a8 is described below commit 1bd08df1a81000af3ae826343c464a8ef3bddce5 Author: remm <r...@apache.org> AuthorDate: Fri May 3 14:31:38 2024 +0200 Deprecate offset, as mentioned in the todo Javadoc improvements. --- .../catalina/authenticator/BasicAuthenticator.java | 4 +- .../authenticator/SpnegoAuthenticator.java | 2 +- java/org/apache/catalina/mapper/Mapper.java | 42 ++++++------- java/org/apache/coyote/ajp/AjpMessage.java | 2 +- java/org/apache/coyote/ajp/AjpProcessor.java | 2 +- .../apache/coyote/http11/Http11OutputBuffer.java | 2 +- .../http11/filters/SavedRequestInputFilter.java | 4 +- java/org/apache/coyote/http2/Stream.java | 2 +- java/org/apache/tomcat/util/buf/AbstractChunk.java | 71 +++++++++++++++++++--- java/org/apache/tomcat/util/buf/B2CConverter.java | 4 +- java/org/apache/tomcat/util/buf/C2BConverter.java | 4 +- java/org/apache/tomcat/util/buf/CharChunk.java | 6 +- java/org/apache/tomcat/util/buf/MessageBytes.java | 2 +- java/org/apache/tomcat/util/buf/UDecoder.java | 2 +- java/org/apache/tomcat/util/http/Parameters.java | 2 +- .../tomcat/util/http/Rfc6265CookieProcessor.java | 2 +- java/org/apache/tomcat/util/http/parser/Host.java | 2 +- .../authenticator/TestBasicAuthParser.java | 4 +- 18 files changed, 105 insertions(+), 54 deletions(-) diff --git a/java/org/apache/catalina/authenticator/BasicAuthenticator.java b/java/org/apache/catalina/authenticator/BasicAuthenticator.java index 17c4a85857..9d8151850e 100644 --- a/java/org/apache/catalina/authenticator/BasicAuthenticator.java +++ b/java/org/apache/catalina/authenticator/BasicAuthenticator.java @@ -152,7 +152,7 @@ public class BasicAuthenticator extends AuthenticatorBase { */ public BasicCredentials(ByteChunk input, Charset charset) throws IllegalArgumentException { authorization = input; - initialOffset = input.getOffset(); + initialOffset = input.getStart(); this.charset = charset; parseMethod(); @@ -203,7 +203,7 @@ public class BasicAuthenticator extends AuthenticatorBase { 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 9e4537ce0c..1ea2f4c734 100644 --- a/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java +++ b/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java @@ -165,7 +165,7 @@ public class SpnegoAuthenticator extends AuthenticatorBase { 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 c07c6c12ff..af14edaeda 100644 --- a/java/org/apache/catalina/mapper/Mapper.java +++ b/java/org/apache/catalina/mapper/Mapper.java @@ -724,13 +724,13 @@ public final class Mapper { // 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) { @@ -832,16 +832,16 @@ public final class Mapper { 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; @@ -875,7 +875,7 @@ public final class Mapper { // 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; } @@ -895,10 +895,10 @@ public final class Mapper { } 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); @@ -926,7 +926,7 @@ public final class Mapper { } } - path.setOffset(servletPath); + path.setStart(servletPath); path.setEnd(pathEnd); } @@ -945,14 +945,14 @@ public final class Mapper { } 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); } } @@ -984,7 +984,7 @@ public final class Mapper { // 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 { @@ -998,7 +998,7 @@ public final class Mapper { } } - path.setOffset(pathOffset); + path.setStart(pathStart); path.setEnd(pathEnd); } @@ -1066,10 +1066,10 @@ public final class Mapper { 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; @@ -1090,7 +1090,7 @@ public final class Mapper { 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] == '/') { @@ -1107,7 +1107,7 @@ public final class Mapper { } } 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)) { @@ -1116,7 +1116,7 @@ public final class Mapper { 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 c20f4a26c5..04e99aab9f 100644 --- a/java/org/apache/coyote/ajp/AjpMessage.java +++ b/java/org/apache/coyote/ajp/AjpMessage.java @@ -167,7 +167,7 @@ public class AjpMessage { // 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 20795b18a3..0cd678e7b2 100644 --- a/java/org/apache/coyote/ajp/AjpProcessor.java +++ b/java/org/apache/coyote/ajp/AjpProcessor.java @@ -722,7 +722,7 @@ public class AjpProcessor extends AbstractProcessor { } 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 627d86e87e..be7955c1b0 100644 --- a/java/org/apache/coyote/http11/Http11OutputBuffer.java +++ b/java/org/apache/coyote/http11/Http11OutputBuffer.java @@ -388,7 +388,7 @@ public class Http11OutputBuffer implements HttpOutputBuffer { // 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 fb3b8638eb..a10063005b 100644 --- a/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java +++ b/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java @@ -46,7 +46,7 @@ public class SavedRequestInputFilter implements InputFilter { @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 class SavedRequestInputFilter implements InputFilter { @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 9decf7f528..a0a5f1f7f9 100644 --- a/java/org/apache/coyote/http2/Stream.java +++ b/java/org/apache/coyote/http2/Stream.java @@ -1276,7 +1276,7 @@ class Stream extends AbstractNonZeroStream implements HeaderEmitter { 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 3e06362f5f..41d207a08c 100644 --- a/java/org/apache/tomcat/util/buf/AbstractChunk.java +++ b/java/org/apache/tomcat/util/buf/AbstractChunk.java @@ -58,6 +58,9 @@ public abstract class AbstractChunk implements Cloneable, Serializable { } + /** + * @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 abstract class AbstractChunk implements Cloneable, Serializable { } + /** + * 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 abstract class AbstractChunk implements Cloneable, Serializable { } + /** + * @return {@code true} if the buffer contains no data + */ public boolean isNull() { if (end > 0) { return false; @@ -121,19 +154,30 @@ public abstract class AbstractChunk implements Cloneable, Serializable { } - 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 abstract class AbstractChunk implements Cloneable, Serializable { } + /** + * @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 abstract class AbstractChunk implements Cloneable, Serializable { } + /** + * @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 68cbd05598..5c75453c19 100644 --- a/java/org/apache/tomcat/util/buf/B2CConverter.java +++ b/java/org/apache/tomcat/util/buf/B2CConverter.java @@ -161,11 +161,11 @@ public class B2CConverter { } 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 9c0c34b4c4..2e3db2b526 100644 --- a/java/org/apache/tomcat/util/buf/C2BConverter.java +++ b/java/org/apache/tomcat/util/buf/C2BConverter.java @@ -121,11 +121,11 @@ public final class C2BConverter { } 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 4f3dcf4188..1c919cdf5a 100644 --- a/java/org/apache/tomcat/util/buf/CharChunk.java +++ b/java/org/apache/tomcat/util/buf/CharChunk.java @@ -175,7 +175,7 @@ public final class CharChunk extends AbstractChunk implements CharSequence { public void append(CharChunk src) throws IOException { - append(src.getBuffer(), src.getOffset(), src.getLength()); + append(src.getBuffer(), src.getStart(), src.getLength()); } @@ -468,7 +468,7 @@ public final class CharChunk extends AbstractChunk implements CharSequence { public boolean equals(CharChunk cc) { - return equals(cc.getChars(), cc.getOffset(), cc.getLength()); + return equals(cc.getChars(), cc.getStart(), cc.getLength()); } @@ -632,7 +632,7 @@ public final class CharChunk extends AbstractChunk implements CharSequence { 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 c4aa30b2be..4802b671cb 100644 --- a/java/org/apache/tomcat/util/buf/MessageBytes.java +++ b/java/org/apache/tomcat/util/buf/MessageBytes.java @@ -576,7 +576,7 @@ public final class MessageBytes implements Cloneable, Serializable { 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 ec9a4b768d..d698c5f935 100644 --- a/java/org/apache/tomcat/util/buf/UDecoder.java +++ b/java/org/apache/tomcat/util/buf/UDecoder.java @@ -94,7 +94,7 @@ public final class UDecoder { 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 d179e9977f..a6a07d1732 100644 --- a/java/org/apache/tomcat/util/http/Parameters.java +++ b/java/org/apache/tomcat/util/http/Parameters.java @@ -376,7 +376,7 @@ public final class Parameters { 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 e8227a6d0d..cf25f59e9d 100644 --- a/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java +++ b/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java @@ -93,7 +93,7 @@ public class Rfc6265CookieProcessor extends CookieProcessorBase { } 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 f9cb602bfe..06415c6f01 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 @@ public class Host { 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 36496b8f1b..514603ab9c 100644 --- a/test/org/apache/catalina/authenticator/TestBasicAuthParser.java +++ b/test/org/apache/catalina/authenticator/TestBasicAuthParser.java @@ -454,7 +454,7 @@ public class TestBasicAuthParser { + ioe.getMessage()); } // emulate tomcat server - offset points to method in header - authHeader.setOffset(initialOffset); + authHeader.setStart(initialOffset); } /* @@ -474,7 +474,7 @@ public class TestBasicAuthParser { + ioe.getMessage()); } // emulate tomcat server - offset points to method in header - authHeader.setOffset(initialOffset); + authHeader.setStart(initialOffset); } /* --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org