void moloch_http_free_server(void *serverV) { MolochHttpServer_t *server = serverV; g_source_remove(server->multiTimer); // Finish any still running requests while (server->multiRunning) { curl_multi_perform(server->multi, &server->multiRunning); moloch_http_curlm_check_multi_info(server); } // Free sync info if (server->syncRequest.easy) { curl_easy_cleanup(server->syncRequest.easy); server->syncRequest.easy = 0; } if (server->syncRequest.dataIn) free(server->syncRequest.dataIn); // Free multi info curl_multi_cleanup(server->multi); g_strfreev(server->names); MOLOCH_TYPE_FREE(MolochHttpServer_t, server); }
/* Called by glib when our timeout expires */ static gboolean moloch_http_timer_callback(gpointer serverV) { MolochHttpServer_t *server = serverV; while (curl_multi_perform(server->multi, &server->multiRunning) == CURLM_CALL_MULTI_PERFORM) { } moloch_http_curlm_check_multi_info(server); return G_SOURCE_CONTINUE; }
static gboolean moloch_http_curl_watch_open_callback(int fd, GIOCondition condition, gpointer serverV) { MolochHttpServer_t *server = serverV; struct sockaddr_in localAddress, remoteAddress; socklen_t addressLength = sizeof(localAddress); int rc = getsockname(fd, (struct sockaddr*)&localAddress, &addressLength); if (rc != 0) return FALSE; addressLength = sizeof(remoteAddress); rc = getpeername(fd, (struct sockaddr*)&remoteAddress, &addressLength); if (rc != 0) return FALSE; char sessionId[MOLOCH_SESSIONID_LEN]; moloch_session_id(sessionId, localAddress.sin_addr.s_addr, localAddress.sin_port, remoteAddress.sin_addr.s_addr, remoteAddress.sin_port); LOG("Connected %d/%d - %s %d->%s:%d - fd:%d", server->outstanding, server->connections, server->names[0], ntohs(localAddress.sin_port), inet_ntoa(remoteAddress.sin_addr), ntohs(remoteAddress.sin_port), fd); MolochHttpConn_t *conn; MOLOCH_LOCK(connections); BIT_SET(fd, connectionsSet); HASH_FIND(h_, connections, sessionId, conn); if (!conn) { conn = MOLOCH_TYPE_ALLOC0(MolochHttpConn_t); HASH_ADD(h_, connections, sessionId, conn); memcpy(&conn->sessionId, sessionId, sessionId[0]); server->connections++; } else { char buf[1000]; LOG("ERROR - Already added %x %s", condition, moloch_session_id_string(sessionId, buf)); } MOLOCH_UNLOCK(connections); moloch_http_curlm_check_multi_info(server); return FALSE; }
static gboolean moloch_http_watch_callback(int fd, GIOCondition condition, gpointer serverV) { MolochHttpServer_t *server = serverV; int action = (condition & G_IO_IN ? CURL_CSELECT_IN : 0) | (condition & G_IO_OUT ? CURL_CSELECT_OUT : 0) | (condition & (G_IO_HUP | G_IO_ERR) ? CURL_CSELECT_ERR : 0); while (curl_multi_socket_action(server->multi, fd, action, &server->multiRunning) == CURLM_CALL_MULTI_PERFORM) { } moloch_http_curlm_check_multi_info(server); return TRUE; }
LOCAL gboolean moloch_http_curl_watch_open_callback(int fd, GIOCondition condition, gpointer snameV) { MolochHttpServerName_t *sname = snameV; MolochHttpServer_t *server = sname->server; struct sockaddr_storage localAddressStorage, remoteAddressStorage; socklen_t addressLength = sizeof(localAddressStorage); int rc = getsockname(fd, (struct sockaddr*)&localAddressStorage, &addressLength); if (rc != 0) return CURLE_OK; addressLength = sizeof(remoteAddressStorage); rc = getpeername(fd, (struct sockaddr*)&remoteAddressStorage, &addressLength); if (rc != 0) return CURLE_OK; char sessionId[MOLOCH_SESSIONID_LEN]; int localPort, remotePort; char remoteIp[INET6_ADDRSTRLEN+2]; if (localAddressStorage.ss_family == AF_INET) { struct sockaddr_in *localAddress = (struct sockaddr_in *)&localAddressStorage; struct sockaddr_in *remoteAddress = (struct sockaddr_in *)&remoteAddressStorage; moloch_session_id(sessionId, localAddress->sin_addr.s_addr, localAddress->sin_port, remoteAddress->sin_addr.s_addr, remoteAddress->sin_port); localPort = ntohs(localAddress->sin_port); remotePort = ntohs(remoteAddress->sin_port); inet_ntop(AF_INET, &remoteAddress->sin_addr, remoteIp, sizeof(remoteIp)); } else { struct sockaddr_in6 *localAddress = (struct sockaddr_in6 *)&localAddressStorage; struct sockaddr_in6 *remoteAddress = (struct sockaddr_in6 *)&remoteAddressStorage; moloch_session_id6(sessionId, localAddress->sin6_addr.s6_addr, localAddress->sin6_port, remoteAddress->sin6_addr.s6_addr, remoteAddress->sin6_port); localPort = ntohs(localAddress->sin6_port); remotePort = ntohs(remoteAddress->sin6_port); inet_ntop(AF_INET6, &remoteAddress->sin6_addr, remoteIp+1, sizeof(remoteIp)-2); remoteIp[0] = '['; strcat(remoteIp, "]"); } if (config.logHTTPConnections) { LOG("Connected %d/%d - %s %d->%s:%d - fd:%d", server->outstanding, server->connections, sname->name, localPort, remoteIp, remotePort, fd); } MolochHttpConn_t *conn; MOLOCH_LOCK(connections); BIT_SET(fd, connectionsSet); HASH_FIND(h_, connections, sessionId, conn); if (!conn) { conn = MOLOCH_TYPE_ALLOC0(MolochHttpConn_t); HASH_ADD(h_, connections, sessionId, conn); memcpy(&conn->sessionId, sessionId, sessionId[0]); server->connections++; } else { char buf[1000]; LOG("ERROR - Already added %x %s", condition, moloch_session_id_string(sessionId, buf)); } MOLOCH_UNLOCK(connections); moloch_http_curlm_check_multi_info(server); return CURLE_OK; }