in src/incoming.c [425:497]
apr_status_t serf__process_client(serf_incoming_t *client, apr_int16_t events)
{
apr_status_t status;
if (client->wait_for_connect && (events & (APR_POLLIN | APR_POLLOUT))) {
status = client_connected(client);
client->wait_for_connect = FALSE;
if (status) {
return status;
}
}
if ((events & APR_POLLIN) != 0) {
/* If the stop_writing flag was set on the connection, reset it
now because there is some data to read. */
if (client->pump.stop_writing) {
client->pump.stop_writing = false;
serf_io__set_pollset_dirty(&client->io);
}
status = client->perform_read(client);
if (status) {
return status;
}
/* If we decided to close our connection, return now as we don't
* want to write.
*/
if ((client->seen_in_pollset & APR_POLLHUP) != 0) {
return APR_SUCCESS;
}
}
if ((events & APR_POLLHUP) != 0) {
status = client->perform_hangup(client);
if (status) {
return status;
}
}
if ((events & APR_POLLERR) != 0) {
#ifdef SO_ERROR
/* If possible, get the error from the platform's socket layer and
convert it to an APR status code. */
{
apr_os_sock_t osskt;
if (!apr_os_sock_get(&osskt, client->skt)) {
int error;
apr_socklen_t l = sizeof(error);
if (!getsockopt(osskt, SOL_SOCKET, SO_ERROR, (char*)&error,
&l)) {
status = APR_FROM_OS_ERROR(error);
if (status)
return status;
}
}
}
#endif
return APR_EGENERAL;
}
if ((events & APR_POLLOUT) != 0) {
status = client->perform_write(client);
if (status) {
return status;
}
}
return APR_SUCCESS;
}