RFR: JDK-8061729 : Update java/net tests to eliminate dependency on sun.net.www.MessageHeader and some other internal APIs
Daniel Fuchs
dfuchs at openjdk.java.net
Thu Oct 14 09:42:50 UTC 2021
On Wed, 13 Oct 2021 22:04:23 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
It may be that the new library HttpHeaderParser works for the small use cases in which it is used, but its parsing of header fields is approximative. I am a bit uncomfortable by replacing a well tested parser (MessageHeader) with something that obviously doesn't implement the spec correctly - even though it's possible that the cases where it would give back a wrong answer do not occur in the scenario where it is used.
What is the underlying rationale for wanting to stop using MessageHeader in tests?
test/jdk/sun/net/www/protocol/http/NTLMTest.java line 163:
> 161:
> 162: for (int i=start; i<end; i++) {
> 163: MessageHeader header = new MessageHeader (s.getInputStream());
This change introduces a subtle behaviour difference in the test that may result in spurious "Connection Reset" exception. I would prefer if the existing logic was kept - and the test continued parsing the request headers before writing to the output.
test/lib/jdk/test/lib/net/HttpHeaderParser.java line 47:
> 45: while(true) {
> 46: headerString = br.readLine();
> 47: if(headerString == null || headerString.isBlank()) {
This is not completely correct, a blank line would be an error, I think, or possibly an empty continuation line. isBlank() should be replaced by isEmpty().
test/lib/jdk/test/lib/net/HttpHeaderParser.java line 54:
> 52: List <String> values = new ArrayList<>();
> 53: String headerValue = headerString.substring(headerString.indexOf(": ") + 2);
> 54: String [] valueArray = headerValue.split(",");
This is not right either - at least that's not how MessageHeader (or the HttpClient or HttpServer header parsers work). Multi-valued header correspond to header fields whose name appear on several lines.
foo: bar, baz
=> single value "bar, baz"
foo: bar
foo: baz
multiple values => "bar", "baz"
Usually - analyzing the value - and possibly splitting it around `,` or `;` is done in the second step at a higher level.
test/lib/jdk/test/lib/net/HttpHeaderParser.java line 62:
> 60: } else {
> 61: requestDetails = headerString.trim();
> 62: }
This is not right: the request line - or status line - is the first line which is read - not just any line that doesn't contain `:`
FWIW, a request line may contain the full URL and therefore may contain `:`
test/lib/jdk/test/lib/net/HttpHeaderParser.java line 63:
> 61: requestDetails = headerString.trim();
> 62: }
> 63: }
You should also take into account continuation lines (lines that begin with a space) - and IIRC a continuation would be \r followed by a space - so I'm not 100% sure that using readline() is completely appropriate as it will consume \r, \n, or \r\n equally.
-------------
PR: https://git.openjdk.java.net/jdk/pull/5937
More information about the net-dev
mailing list