/* * Copyright (c) 2016, 2022, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
/** * @test * @bug 8164704 * @modules java.net.http * jdk.httpserver * java.base/sun.net.www * @run main MessageHeadersTest * @summary Tests expected behavior of MessageHeader. This test * cannot be used to verify 8164704 - it simply verifies * the assumptions on which the fix is based.
*/
/** * Verifies that MessageHeader behave as we expect. * @param msg The response string. * @throws IOException should not happen.
*/ staticvoid testMessageHeaders(String msg) throws IOException { byte[] bytes = msg.getBytes("US-ASCII");
ByteBuffer buffer = ByteBuffer.wrap(bytes);
// Read status line
String statusLine = readStatusLine(buffer);
System.out.println("StatusLine: " + statusLine); if (!statusLine.startsWith("HTTP/1.1")) { thrownew AssertionError("bad status line: " + statusLine);
}
// Wrap the buffer into an input stream and pass // that to MessageHeader to read the header. // We have two cases: // - MESSAGE_OK: there will be some headers to read, // - MESSAGE_NOK: there will be no headers to read.
ByteBufferInputStream bbis = new ByteBufferInputStream(buffer);
sun.net.www.MessageHeader mh = new sun.net.www.MessageHeader(bbis);
// Now get the expected length of the body
String contentLengthValue = mh.findValue("Content-length"); int contentLength = contentLengthValue == null ? 0
: Integer.parseInt(contentLengthValue);
// We again have two cases: // - MESSAGE_OK: there should be a Content-length: header // - MESSAGE_NOK: there should be no Content-length: header if (contentLengthValue == null) { // MESSAGE_NOK has no headers and no body and therefore // no Content-length: header. if (!MESSAGE_NOK.equals(msg)) { thrownew AssertionError("Content-length: header not found");
} // In that case we expect MessageHeader to read the CR but // leave the LF in the buffer. We therefore need to consume // the LF in order to get an empty (all consumed) buffer. // This is what ResponseHeaders does. byte c = buffer.get(); if (c != '\n' || bbis.lastRead != '\r') { thrownew AssertionError("Unexpected byte sequence for empty body"
+ ": " + bbis.lastRead + " " + c + " expected "
+ (byte)'\r' + " " + (byte)'\n');
}
} else { if (MESSAGE_NOK.equals(msg)) { thrownew AssertionError("Content-length: header found in"
+ " error 101 message");
}
}
// Now read the remaining bytes. It should either be // the empty string (MESSAGE_NOK) or BODY (MESSAGE_OK), // and it should not contains any leading CR or LF"
String remaining = readRemainingBytes(buffer);
System.out.println("Body: <<<" + remaining + ">>>"); if (remaining.length() != contentLength) { thrownew AssertionError("Unexpected body length: " + remaining.length()
+ " expected " + contentLengthValue);
} if (contentLengthValue != null) { if (!BODY.equals(remaining)) { thrownew AssertionError("Body does not match!");
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.