On Tue, 14 Jan 2025 14:48:52 GMT, Daniel Fuchs <dfu...@openjdk.org> wrote:

>> Volkan Yazıcı has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   Add missing `@since` tags
>
> src/java.net.http/share/classes/java/net/http/HttpResponse.java line 758:
> 
>> 756:          * @param downstreamHandler the downstream handler to pass 
>> received data to
>> 757:          * @param capacity the maximum number of bytes that are allowed
>> 758:          * @param discardExcess if {@code true}, excessive input will 
>> be discarded; otherwise, it will throw an exception
> 
> I would suggest to simplify the code and drop `discardExcess` for the moment. 
> We could add an overload later if needed. The body of the method API 
> specification could then read something like:
> 
> 
>             /**
>              * {@return a {@code BodyHandler} limiting the number of bytes
>              * consumed and passed to the given downstream {@code 
> BodyHandler}}
>              * <p>
>              * If the number of bytes received exceeds the maximum number
>              * of bytes desired as indicated by the given {@code capacity}, 
>              * {@link BodySubscriber#onError(Throwable) onError} is called on
>              * the downstream {@code BodySubscriber} with an {@link 
> IOException} 
>              * indicating that the capacity is exceeded; the
>              * upstream subscription is cancelled.

67d4b878047d9dc762585069fe32156cac54c698 removes `discardExcess` and 
b95ff8d81751bc09e6c7ba219bbf8bd949f65ba8 improves the JavaDoc.

> src/java.net.http/share/classes/jdk/internal/net/http/LimitingSubscriber.java 
> line 99:
> 
>> 97:         if (lengthAllocated) {
>> 98:             downstreamSubscriber.onNext(buffers);
>> 99:         }
> 
> You would need to maintain a state of what methods have been called on the 
> the downstream subscriber. If onComplete/onError have been already called, 
> onNext should no longer be called, and onComplete/onError should not be 
> called twice.
> 
> It's possible that onNext will still be invoked after cancelling the 
> subscription. This is to be expected - delivery will eventually stop, but at 
> this point any bytes passed to onNext should simply be discarded.
> 
> I believe it would be better in a first time to drop the `discardExcess` 
> feature and simply call `onError` if the capacity is exceeded. That should 
> simplify this code significantly.

@dfuch, implemented requested changes. Would you mind reviewing the newly added 
`stateRef` and its usage, please?

> src/java.net.http/share/classes/jdk/internal/net/http/LimitingSubscriber.java 
> line 162:
> 
>> 160:     public void onComplete() {
>> 161:         downstreamSubscriber.onComplete();
>> 162:     }
> 
> As hinted earlier you should not call onError again if you already called 
> onError. The publisher should not call onError twice, but if you have already 
> called onError from onNext on the downstream subscriber, you should not call 
> it again (and neither should you call onComplete), if the upstream publisher 
> calls onError/onComplete on the limiting subscriber after this point.

Added state and relevant checks in a4fd1bab9cb50eca5f2040ca5e27798f19d5abfa.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/23096#discussion_r1915525560
PR Review Comment: https://git.openjdk.org/jdk/pull/23096#discussion_r1915526532
PR Review Comment: https://git.openjdk.org/jdk/pull/23096#discussion_r1915527051

Reply via email to