Skip to content

Clarify how async ReadListener changes the contract of ServletInputStream methods #301

Open
@gregw

Description

@gregw

The use of an async ReadListener allows the normal read methods to be used in async mode. However nowhere in the javadoc do we document how that behaviour is changed and I think they may be a few corner cases that are ambiguous:

  • can the ServletInputStream.readLine method be used? Currently it has a default implementation that will fail in async mode as isReady() is not called. Should implementations override this with a method that works asynchronously and returns 0 if a complete line is not available? Or should the default implementation be updated to throw ISE if there is a ReadListener?
  • Ditto for readAllBytes() and readNBytes(...), skip(long), skipNBytes(long), transferTo(OutputStream): should they ISE, block or return null if insufficient data is available?
  • The javadoc of isReady() is very light on and really needs to make clear the scheduling implications of a false return - ie that one of the ReadListener callbacks will eventually be called if false is return.
  • If read(byte[],int,int) is called without previously calling isReady():
    • Should ISE always be thrown?
    • Should ISE be thrown only if there is no data available?
    • Should 0 be returned if there is no data available? If so, is this equivalent to a call to isReady() returning false? ie will a callback be scheduled when data is available?
  • If read(byte[],int,int) is called after isReady() returns false and onDataAvailable, should 0 be returned or ISE thrown?
  • If read() is called, then returning 0 is not an option as it is a valid byte. So how should read() handle all of the situations above?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Candidate4NextReleaseThis issues should be consider for inclusion in the next release project.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions