Example #1
0
clconfig_provider * lcb_clconfig_create_cccp(lcb_confmon *mon)
{
    cccp_provider *cccp = calloc(1, sizeof(*cccp));
    cccp->nodes = hostlist_create();
    cccp->base.type = LCB_CLCONFIG_CCCP;
    cccp->base.refresh = cccp_get;
    cccp->base.get_cached = cccp_get_cached;
    cccp->base.pause = cccp_pause;
    cccp->base.shutdown = cccp_cleanup;
    cccp->base.nodes_updated = nodes_updated;
    cccp->base.parent = mon;
    cccp->base.enabled = 0;
    cccp->timer = lcb_timer_create_simple(mon->settings->io,
                                          cccp,
                                          mon->settings->config_timeout,
                                          socket_timeout);
    lcb_timer_disarm(cccp->timer);

    if (!cccp->nodes) {
        free(cccp);
        return NULL;
    }

    if (lcb_connection_init(&cccp->connection,
                            cccp->base.parent->settings->io,
                            cccp->base.parent->settings) != LCB_SUCCESS) {
        free(cccp);
        return NULL;
    }

    return &cccp->base;
}
Example #2
0
static lcb_error_t http_setup(lcb_t instance)
{
    char buffer[1024];
    lcb_ssize_t offset = 0;
    lcb_error_t err;
    lcb_connection_t conn = &instance->bootstrap.via.http.connection;
    struct lcb_http_bootstrap_st *http = &instance->bootstrap.via.http;

    http->weird_things_threshold = LCB_DEFAULT_CONFIG_ERRORS_THRESHOLD;
    http->bummer = 0;

    switch (instance->type) {
    case LCB_TYPE_BUCKET:
        offset = snprintf(buffer, sizeof(buffer),
                          "GET /pools/default/bucketsStreaming/%s HTTP/1.1\r\n",
                          instance->bucket);
        break;
    case LCB_TYPE_CLUSTER:
        offset = snprintf(buffer, sizeof(buffer), "GET /pools/ HTTP/1.1\r\n");
        break;
    default:
        return LCB_EINVAL;
    }

    err = lcb_connection_init(conn, instance);
    if (err != LCB_SUCCESS) {
        return err;
    }
    conn->data = instance;

    if (instance->password) {
        char cred[256];
        char base64[256];
        snprintf(cred, sizeof(cred), "%s:%s", instance->username, instance->password);
        if (lcb_base64_encode(cred, base64, sizeof(base64)) == -1) {
            lcb_destroy(instance);
            return LCB_EINTERNAL;
        }
        offset += snprintf(buffer + offset, sizeof(buffer) - (lcb_size_t)offset,
                           "Authorization: Basic %s\r\n", base64);
    }

    offset += snprintf(buffer + offset, sizeof(buffer) - (lcb_size_t)offset,
                       "%s", LCB_LAST_HTTP_HEADER);

    /* Add space for: Host: \r\n\r\n" */
    http->uri = malloc(strlen(buffer) + strlen(instance->config.backup_nodes[0]) + 80);
    if (http->uri == NULL) {
        lcb_destroy(instance);
        return LCB_CLIENT_ENOMEM;
    }
    strcpy(http->uri, buffer);

    return LCB_SUCCESS;
}
Example #3
0
clconfig_provider * lcb_clconfig_create_http(lcb_confmon *parent)
{
    lcb_error_t status;
    struct lcb_io_use_st use;
    http_provider *http = calloc(1, sizeof(*http));
    if (!http) {
        return NULL;
    }

    status = lcb_connection_init(&http->connection,
                                 parent->settings->io,
                                 parent->settings);

    if (status != LCB_SUCCESS) {
        free(http);
        return NULL;
    }

    if (! (http->nodes = hostlist_create())) {
        lcb_connection_cleanup(&http->connection);
        free(http);
        return NULL;
    }

    http->base.type = LCB_CLCONFIG_HTTP;
    http->base.refresh = get_refresh;
    http->base.pause = pause_http;
    http->base.get_cached = http_get_cached;
    http->base.shutdown = shutdown_http;
    http->base.nodes_updated = refresh_nodes;
    http->base.enabled = 0;
    http->io_timer = lcb_timer_create_simple(parent->settings->io,
                                             http,
                                             parent->settings->config_node_timeout,
                                             timeout_handler);
    lcb_timer_disarm(http->io_timer);

    http->disconn_timer = lcb_timer_create_simple(parent->settings->io,
                                                  http,
                                                  parent->settings->bc_http_stream_time,
                                                  delayed_disconn);
    lcb_timer_disarm(http->disconn_timer);

    lcb_connuse_easy(&use, http, io_read_handler, io_error_handler);
    lcb_connection_use(&http->connection, &use);

    lcb_string_init(&http->stream.chunk);
    lcb_string_init(&http->stream.header);
    lcb_string_init(&http->stream.input);

    return &http->base;
}
Example #4
0
static lcb_error_t cccp_setup(lcb_t instance)
{
    lcb_error_t rc;
    lcb_server_t *serv = &instance->bootstrap.via.cccp.server;

    instance->bootstrap.via.cccp.next_config = NULL;
    /* TODO check if connected server sockets can be re-used */

    rc = lcb_setup_sasl(instance);
    if (rc != LCB_SUCCESS) {
        return rc;
    }
    memset(serv, 0, sizeof(*serv));
    serv->index = -1;
    serv->instance = instance;
    rc = lcb_connection_init(&serv->connection, instance);
    if (rc != LCB_SUCCESS) {
        return rc;
    }
    serv->connection.data = serv;
    instance->callbacks.cluster_config = config_callback;
    return LCB_SUCCESS;
}
Example #5
0
lcb_error_t lcb_server_initialize(lcb_server_t *server, int servernum)
{
    /* Initialize all members */
    lcb_error_t err;
    char *p;
    const char *n = vbucket_config_get_server(server->instance->vbucket_config,
                                              servernum);

    err = lcb_connection_init(&server->connection,
                              server->instance->settings.io,
                              &server->instance->settings);
    if (err != LCB_SUCCESS) {
        return err;
    }

    server->connection.data = server;
    server->index = servernum;
    server->authority = strdup(n);
    strcpy(server->curhost.host, n);
    p = strchr(server->curhost.host, ':');
    *p = '\0';
    strcpy(server->curhost.port, p + 1);

    n = vbucket_config_get_couch_api_base(server->instance->vbucket_config,
                                          servernum);
    server->couch_api_base = (n != NULL) ? strdup(n) : NULL;
    n = vbucket_config_get_rest_api_server(server->instance->vbucket_config,
                                           servernum);
    server->rest_api_server = strdup(n);
    server->io_timer = lcb_timer_create_simple(server->instance->settings.io,
                                               server, MCSERVER_TIMEOUT(server),
                                               tmo_thunk);
    lcb_timer_disarm(server->io_timer);

    return LCB_SUCCESS;
}