logger_t *logger;
httpd_callbacks_t callbacks;
- int use_rtsp;
-
int max_connections;
int open_connections;
http_connection_t *connections;
};
httpd_t *
-httpd_init(logger_t *logger, httpd_callbacks_t *callbacks, int max_connections, int use_rtsp)
+httpd_init(logger_t *logger, httpd_callbacks_t *callbacks, int max_connections)
{
httpd_t *httpd;
return NULL;
}
- httpd->use_rtsp = !!use_rtsp;
httpd->max_connections = max_connections;
httpd->connections = calloc(max_connections, sizeof(http_connection_t));
if (!httpd->connections) {
/* Get the correct nfds value and set rfds */
FD_ZERO(&rfds);
if (httpd->open_connections < httpd->max_connections) {
- FD_SET(httpd->server_fd4, &rfds);
- nfds = httpd->server_fd4+1;
+ if (httpd->server_fd4 != -1) {
+ FD_SET(httpd->server_fd4, &rfds);
+ if (nfds <= httpd->server_fd4) {
+ nfds = httpd->server_fd4+1;
+ }
+ }
if (httpd->server_fd6 != -1) {
FD_SET(httpd->server_fd6, &rfds);
if (nfds <= httpd->server_fd6) {
break;
}
- if (FD_ISSET(httpd->server_fd4, &rfds)) {
+ if (httpd->open_connections < httpd->max_connections &&
+ httpd->server_fd4 != -1 && FD_ISSET(httpd->server_fd4, &rfds)) {
ret = httpd_accept_connection(httpd, httpd->server_fd4, 0);
if (ret == -1) {
break;
continue;
}
}
- if (httpd->server_fd6 != -1 && FD_ISSET(httpd->server_fd6, &rfds)) {
+ if (httpd->open_connections < httpd->max_connections &&
+ httpd->server_fd6 != -1 && FD_ISSET(httpd->server_fd6, &rfds)) {
ret = httpd_accept_connection(httpd, httpd->server_fd6, 1);
if (ret == -1) {
break;
/* If not in the middle of request, allocate one */
if (!connection->request) {
- connection->request = http_request_init(httpd->use_rtsp);
+ connection->request = http_request_init();
assert(connection->request);
}
}
written += ret;
}
+
+ if (http_response_get_disconnect(response)) {
+ logger_log(httpd->logger, LOGGER_INFO, "Disconnecting on software request");
+ httpd_remove_connection(httpd, connection);
+ }
} else {
logger_log(httpd->logger, LOGGER_INFO, "Didn't get response");
}
http_response_destroy(response);
+ } else {
+ logger_log(httpd->logger, LOGGER_DEBUG, "Request not complete, waiting for more data...");
}
}
}
httpd_remove_connection(httpd, connection);
}
+ /* Close server sockets since they are not used any more */
+ if (httpd->server_fd4 != -1) {
+ closesocket(httpd->server_fd4);
+ httpd->server_fd4 = -1;
+ }
+ if (httpd->server_fd6 != -1) {
+ closesocket(httpd->server_fd6);
+ httpd->server_fd6 = -1;
+ }
+
logger_log(httpd->logger, LOGGER_INFO, "Exiting HTTP thread");
return 0;
int
httpd_start(httpd_t *httpd, unsigned short *port)
{
+ /* How many connection attempts are kept in queue */
+ int backlog = 5;
+
assert(httpd);
assert(port);
logger_log(httpd->logger, LOGGER_WARNING, "Continuing without IPv6 support");
}
- if (listen(httpd->server_fd4, 5) == -1) {
+ if (httpd->server_fd4 != -1 && listen(httpd->server_fd4, backlog) == -1) {
logger_log(httpd->logger, LOGGER_ERR, "Error listening to IPv4 socket");
closesocket(httpd->server_fd4);
closesocket(httpd->server_fd6);
MUTEX_UNLOCK(httpd->run_mutex);
return -2;
}
- if (httpd->server_fd6 != -1 && listen(httpd->server_fd6, 5) == -1) {
+ if (httpd->server_fd6 != -1 && listen(httpd->server_fd6, backlog) == -1) {
logger_log(httpd->logger, LOGGER_ERR, "Error listening to IPv6 socket");
closesocket(httpd->server_fd4);
closesocket(httpd->server_fd6);