Hi Chris, > Forget about EOFException, that was my mistake in the first email > > (and subject). I'm interested in improved handling of aborted > > connections (at least most of them). That's my end goal. > > > > read=-1 solely does not provide sufficient information to be able > > to distinguish between malformed request bodies and actual aborted > > connections. > > How is Tomcat supposed to determine the difference? > > > That's why the ServletInputStream#readLine API says: Returns: an > > integer specifying the actual number of bytes read, or -1 if the > > end of the stream is reached Throws: IOException - if an input or > > output exception has occurred > > End-of-stream is not an exceptional condition. > > > I understand that detecting aborted connections is not always > > possible because of the missed handshakes but given that apache2 > > and tomcat are most likely in the same local network and assuming > > the protocol closes sockets properly, as long as apache2 detects it > > tomcat should also. > > You are talking about AJP, which does not close connections between > the reverse proxy (httpd) and Tomcat. So... what event are you looking > for that Tomcat can use to signal an error? >
You're spot on for the source of confusion. I thought AJP does close the connection between the reverse proxy and tomcat based on the apache log below (especially line 3 and 6). [Wed Jan 17 14:42:41 2018] [23791:140542260176640] [info] ajp_service::jk_ajp_common.c (2773): (directory_service) sending request to tomcat failed (unrecoverable), because of client read error (attempt=1) [Wed Jan 17 14:42:41 2018] [23791:140542260176640] [debug] ajp_reset_endpoint::jk_ajp_common.c (851): (directory_service) resetting endpoint with socket 23 (socket shutdown) [Wed Jan 17 14:42:41 2018] [23791:140542260176640] [debug] ajp_abort_endpoint::jk_ajp_common.c (821): (directory_service) aborting endpoint with socket 23 [Wed Jan 17 14:42:41 2018] [23791:140542260176640] [debug] jk_shutdown_socket::jk_connect.c (932): About to shutdown socket 23 [ 127.0.0.1:42538 -> 127.0.0.1:15443] [Wed Jan 17 14:42:41 2018] [23791:140542260176640] [debug] jk_is_input_event::jk_connect.c (1383): timeout during poll on socket 23 [ 127.0.0.1:42538 -> 127.0.0.1:15443] (timeout=100) [Wed Jan 17 14:42:41 2018] [23791:140542260176640] [debug] jk_shutdown_socket::jk_connect.c (1016): Shutdown socket 23 [127.0.0.1:42538 -> 127.0.0.1:15443] and read 0 lingering bytes in 0 sec. [Wed Jan 17 14:42:41 2018] [23791:140542260176640] [debug] ajp_done::jk_ajp_common.c (3282): recycling connection pool for worker directory_service and socket -1 [Wed Jan 17 14:42:41 2018] [23791:140542260176640] [debug] jk_handler::mod_jk.c (2921): Consumed 0 bytes of remaining request data for worker=directory_service [Wed Jan 17 14:42:41 2018] [23791:140542260176640] [info] jk_handler::mod_jk.c (2984): Aborting connection for worker=directory_service And also based on the ajp workers documentation which has specific recovery_options 4 that closes the connection to tomcat if an error when writing back the answer to the client is detected. Yes, this is for write not read. So, the next question is whether there is a way to have connections between apache and tomcat closed when aborted. > > I therefore think my expectation for an IOException when trying to > > read is justified. > > > > Do you still think otherwise? > > I do. It's not really up to Tomcat to verify that the client sent all > of the data it intended to send. > > George