Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add mochiweb_request:is_closed/1 function #258

Merged
merged 1 commit into from
Aug 31, 2023

Commits on Aug 31, 2023

  1. Add mochiweb_request:is_closed/1 function

    This function can used during long running request callbacks to detect if the
    client connection is closed.
    
    If the request callback periodically streams data back to the client, the act
    of writting to the client socket will detect if it is closed or not. However,
    in cases when no data is sent back, and the client times-out and closes the
    connection, it may be useful to be able to find out early and stop processing
    the request on the server.
    
    It turns out there is no easy way to detect if a passive mode socket is closed
    in Erlang/OTP [1]. Neither one of inet:monitor/1, inet:info/1, inet:getstat/1
    work. However, it is possible to do it by querying the TCP state info of the
    socket. That option available in Linux since kernel 2.4 and on other Unix-like
    OSes (NetBSD, OpenBSD, FreeBSD and MacOS). Windows also has a tcp info query
    method however it is not reacheable via the gensockopts(2) standard socket API,
    so it can't be queried from Erlang's inet:getopts/2 API.
    
    [1] Using the newer socket module it's possible to detect if a socket is closed
    by attempting a recv with a MSG_PEEK option. However, the regular gen_tcp OTP
    module doesn't have a recv() variant which takes extra options. In addition,
    the new socket implementation still feels rather experimental. (It's not the
    default even in the latest OTP 26 release).
    nickva committed Aug 31, 2023
    Configuration menu
    Copy the full SHA
    8b2d844 View commit details
    Browse the repository at this point in the history