RFR: JDK-8061729 : Update java/net tests to eliminate dependency on sun.net.www.MessageHeader and some other internal APIs [v5]
Daniel Fuchs
dfuchs at openjdk.java.net
Tue Feb 15 13:15:06 UTC 2022
On Fri, 11 Feb 2022 11:15:56 GMT, Mahendra Chhipa <duke at openjdk.java.net> wrote:
>> There are some regression tests depending on sun.net.www.MessageHeader, the internal API dependency should be removed. Some of other internal API dependancies are removed in following issues :
>> JDK-8273142
>> JDK-8268464
>> JDK-8268133
>
> Mahendra Chhipa has updated the pull request incrementally with one additional commit since the last revision:
>
> 1. Handled continuation line
> 2. handled \r, \n, or \r\n
> 3. Added the test for HttpHeaderParser class
test/lib/jdk/test/lib/net/HttpHeaderParser.java line 100:
> 98: public List<String> getHeaderValue(String key) {
> 99: if(headerMap.containsKey(key.toLowerCase())) {
> 100: return headerMap.get(key.toLowerCase());
I'd suggest to use `key.toLowerCase(Locale.ROOT)` - even though it shouldn't really matter if it's guaranteed that keys have been syntactically checked for illegal characters.
test/lib/jdk/test/lib/net/HttpHeaderParser.java line 120:
> 118: * ( when true is returned ), which may not be fully consumed.
> 119: *
> 120: * @param input the ( partial ) header data
It doesn't look like this is a accurate. There's no ByteBuffers anywhere...
test/lib/jdk/test/lib/net/HttpHeaderParser.java line 148:
> 146: case FINISHED -> false;
> 147: case STATUS_LINE_FOUND_LF, STATUS_LINE_END_LF, HEADER_FOUND_LF -> true;
> 148: default -> buffer.available() >= 0;
It's a bit chancy to use InputStream.available() - it would be better to have some `eof` variable that's set to true when EOF is reached, and return `!eof` here
test/lib/jdk/test/lib/net/HttpHeaderParser.java line 162:
> 160: * value from [0, 255] representing the character code.
> 161: *
> 162: * @param input a {@code ByteBuffer} containing a partial input
Input is not a ByteBuffer and it doesn't contain a partial input.
test/lib/jdk/test/lib/net/HttpHeaderParser.java line 171:
> 169: private char get(InputStream input) throws IOException {
> 170: return (char)(input.read() & 0xFF);
> 171: }
That doesn't look right as it will prevent you to read EOF. Maybe it should be:
boolean eof;
...
private int get(InputStream input) throws IOException {
int c = input.read();
if (c < 0) eof = true;
return c;
}
And then you would have to check for EOF everywhere where `get(input)` is called too.
test/lib/jdk/test/lib/net/HttpHeaderParser.java line 175:
> 173: private void readResumeStatusLine(InputStream input) throws IOException {
> 174: char c = 0;
> 175: while (input.available() > 0 && (c = get(input)) != CR) {
It's not a too good idea to depend on input.available() - the spec leaves too much room for odd behaviors.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/InputStream.html#available()
An implementation may decide to return 0 always - as it is the amount of bytes that is guaranteed to be readable without blocking (and an implementation may not know how many bytes can be read without blocking).
-------------
PR: https://git.openjdk.java.net/jdk/pull/5937
More information about the security-dev
mailing list