コード例 #1
0
ファイル: http.c プロジェクト: doduytrung/moloch
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);
}
コード例 #2
0
ファイル: http.c プロジェクト: doduytrung/moloch
/* 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;
}
コード例 #3
0
ファイル: http.c プロジェクト: doduytrung/moloch
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;
}
コード例 #4
0
ファイル: http.c プロジェクト: doduytrung/moloch
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;
}
コード例 #5
0
ファイル: http.c プロジェクト: jpvlsmv/moloch
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;
}