On Tue, 23 Sep 2025 14:50:23 GMT, Josiah Noel <[email protected]> wrote:

>> Following the guideline of the last comment on 
>> [JDK-8349670](https://bugs.openjdk.org/browse/JDK-8349670?focusedId=14794649&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14794649),
>>  resolves the issue where sending a 1xx status code would close the input 
>> stream, preventing the server from reading the body. 
>> 
>> - When a 1xx status code is sent by `sendResponseHeaders`, the input/output 
>> streams will not be closed prematurely.
>> - sentHeaders will not be set to true when sending 1xx status codes
>
> Josiah Noel has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   remove upgrade

I agree that switching protocols should not be part of the PR.

We discussed this before, but I think we _should_ include as part of this fix, 
some symbolic constants to represent the special (and counter-intuitive) length 
values of 0 and -1 for sendResponseHeaders. I started a patch for this and can 
provide what I had. The idea is to define two constants in HttpExchange

        /**
         * No response body is being sent with this response
         */
        public static final long RSPBODY_EMPTY = -1l;
   
        /**
         * The response body is unspecified and will be chunk encoded
         */
        public static final long RSPBODY_CHUNKED = 0;

and then link to these constants (instead of stating 0, or -1 literally) in the 
apidoc for sendResponseHeaders. The following could be a starting point for 
this:

      /**
-      * Starts sending the response back to the client using the current set of
-      * response headers and the numeric response code as specified in this
+      * Starts sending the final response back to the client using the current 
set of
+      * response headers obtained from {@link #getResponseHeaders()} and the 
numeric 
+      * response code as specified in this
       * method. The response body length is also specified as follows. If the
       * response length parameter is greater than {@code zero}, this specifies 
an
       * exact number of bytes to send and the application must send that exact
-      * amount of data. If the response length parameter is {@code zero}, then
-      * chunked transfer encoding is used and an arbitrary amount of data may 
be
+      * amount of data. If the response length parameter has the value 
+      * {@link #RSPBODY_CHUNKED} then the response body uses
+      * chunked transfer encoding and an arbitrary amount of data may be
       * sent. The application terminates the response body by closing the
       * {@link OutputStream}.
-      * If response length has the value {@code -1} then no response body is
-      * being sent.
+      * If response length has the value {@link #RSPBODY_EMPTY} then no 
+      * response body is being sent.
       *
       * <p> If the content-length response header has not already been set then
       * this is set to the appropriate value depending on the response length
       * parameter.
       *
       * <p> This method must be called prior to calling {@link 
#getResponseBody()}.
       *
+      * <p> The request body must be consumed before calling this method.
+      *
       * @implNote This implementation allows the caller to instruct the
       * server to force a connection close after the exchange terminates, by
       * supplying a {@code Connection: close} header to the {@linkplain
       * #getResponseHeaders() response headers} before {@code 
sendResponseHeaders}
       * is called.
       *
       * @param rCode          the response code to send
       * @param responseLength if {@literal > 0}, specifies a fixed response 
body
       *                       length and that exact number of bytes must be 
written
       *                       to the stream acquired from {@link 
#getResponseCode()}
-      *                       If {@literal == 0}, then chunked encoding is 
used,
+      *                       If equal to {@link #RSPBODY_CHUNKED}, then 
chunked encoding is used,
       *                       and an arbitrary number of bytes may be written.
-      *                       If {@literal <= -1}, then no response body 
length is
+      *                       If equal to {@link #RSPBODY_EMPTY}, then no 
response body length is
       *                       specified and no response body may be written.
       * @throws IOException   if the response headers have already been sent 
or an I/O error occurs
       * @see   HttpExchange#getResponseBody()
       */
      public abstract void sendResponseHeaders(int rCode, long responseLength) 
throws IOException;

It's only a doc change obviously. So, existing (correct) code can continue to 
use numeric values, but hopefully new code can be less error-prone if the 
constant names are used.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/27069#issuecomment-3324672414

Reply via email to