int main(int argc, char **argv) { int ret; char opt; dpl_req_t *req = NULL; dpl_dict_t *headers_request = NULL; dpl_dict_t *query_params = NULL; char header[8192]; u_int header_len; optind = 0; ret = dpl_init(); if (DPL_SUCCESS != ret) { fprintf(stderr, "error initing droplet\n"); exit(1); } ctx = dpl_ctx_new(NULL, NULL); if (NULL == ctx) { fprintf(stderr, "error creating droplet ctx\n"); exit(1); } req = dpl_req_new(ctx); if (NULL == req) { fprintf(stderr, "error creating req\n"); exit(1); } while ((opt = getopt(argc, argv, "m:b:r:s:Mc:C:et:q:")) != -1) switch (opt) { case 'm': { dpl_method_t method; method = dpl_method(optarg); if (-1 == method) { fprintf(stderr, "unknown method %s\n", optarg); break ; } dpl_req_set_method(req, method); break ; } case 'b': { ret = dpl_req_set_bucket(req, optarg); if (DPL_SUCCESS != ret) { fprintf(stderr, "error setting bucket %s\n", optarg); exit(1); } break ; } case 'r': { ret = dpl_req_set_resource(req, optarg); if (DPL_SUCCESS != ret) { fprintf(stderr, "error setting resource %s: %s (%d)\n", optarg, dpl_status_str(ret), ret); exit(1); } break ; } case 's': { ret = dpl_req_set_subresource(req, optarg); if (DPL_SUCCESS != ret) { fprintf(stderr, "error setting subresource %s: %s (%d)\n", optarg, dpl_status_str(ret), ret); exit(1); } break ; } case 'M': { dpl_req_add_behavior(req, DPL_BEHAVIOR_MD5); break ; } case 'c': { int fd; struct stat st; dpl_chunk_t *chunk; ssize_t cc; fd = open(optarg, O_RDONLY); if (-1 == fd) xperror("open"); ret = fstat(fd, &st); if (-1 == ret) xperror("stat"); chunk = xmalloc(sizeof (*chunk)); chunk->buf = xmalloc(st.st_size); cc = read(fd, chunk->buf, st.st_size); if (cc != st.st_size) { fprintf(stderr, "short read\n"); exit(1); } chunk->len = st.st_size; dpl_req_set_chunk(req, chunk); close(fd); break ; } case 'C': { ret = dpl_req_set_content_type(req, optarg); if (DPL_SUCCESS != ret) { fprintf(stderr, "error setting content_type %s: %s (%d)\n", optarg, dpl_status_str(ret), ret); exit(1); } break ; } case 'e': { dpl_req_add_behavior(req, DPL_BEHAVIOR_EXPECT); break ; } case 't': { ctx->trace_level = strtoul(optarg, NULL, 0); break ; } case 'q': { query_params = dpl_parse_query_params(optarg); if (NULL == query_params) { fprintf(stderr, "error parsing query_params\n"); exit(1); } break ; } case '?': default: usage(); } argc -= optind; argv += optind; #if 0 { extern void test_strrstr(); test_strrstr(); exit(0); } #endif if (0 != argc) { usage(); } ret = dpl_req_build(req, &headers_request); if (DPL_SUCCESS != ret) { fprintf(stderr, "error in request: %s (%d)\n", dpl_status_str(ret), ret); exit(1); } ret = dpl_req_gen_http_request(req, headers_request, query_params, header, sizeof (header), &header_len); if (DPL_SUCCESS != ret) { fprintf(stderr, "error in request: %s (%d)\n", dpl_status_str(ret), ret); exit(1); } ret = fwrite(header, header_len, 1, stdout); if (1 != ret) { fprintf(stderr, "short write\n"); exit(1); } dpl_dict_free(headers_request); if (NULL != query_params) dpl_dict_free(query_params); if (NULL != req->chunk) { free(req->chunk->buf); free(req->chunk); } dpl_req_free(req); dpl_ctx_free(ctx); dpl_free(); return 0; }
dpl_status_t dpl_cdmi_put_buffered(dpl_ctx_t *ctx, const char *bucket, const char *resource, const char *subresource, dpl_ftype_t object_type, const dpl_dict_t *metadata, const dpl_sysmd_t *sysmd, unsigned int data_len, dpl_conn_t **connp) { char *host; int ret, ret2; dpl_conn_t *conn = NULL; char header[1024]; u_int header_len; struct iovec iov[10]; int n_iov = 0; int connection_close = 0; dpl_dict_t *headers_request = NULL; dpl_dict_t *headers_reply = NULL; dpl_req_t *req = NULL; dpl_chunk_t chunk; req = dpl_req_new(ctx); if (NULL == req) { ret = DPL_ENOMEM; goto end; } dpl_req_set_method(req, DPL_METHOD_PUT); if (NULL != bucket) { ret2 = dpl_req_set_bucket(req, bucket); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } ret2 = dpl_req_set_resource(req, resource); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } if (NULL != subresource) { ret2 = dpl_req_set_subresource(req, subresource); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } chunk.buf = NULL; chunk.len = data_len; dpl_req_set_chunk(req, &chunk); //contact default host dpl_req_rm_behavior(req, DPL_BEHAVIOR_VIRTUAL_HOSTING); dpl_req_add_behavior(req, DPL_BEHAVIOR_HTTP_COMPAT); dpl_req_set_object_type(req, object_type); dpl_req_add_behavior(req, DPL_BEHAVIOR_EXPECT); if (NULL != metadata) { ret2 = dpl_req_add_metadata(req, metadata); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } ret2 = dpl_cdmi_req_build(req, &headers_request, NULL, NULL); if (DPL_SUCCESS != ret2) { ret = DPL_FAILURE; goto end; } host = dpl_dict_get_value(headers_request, "Host"); if (NULL == host) { ret = DPL_FAILURE; goto end; } conn = dpl_conn_open_host(ctx, host, ctx->port); if (NULL == conn) { ret = DPL_FAILURE; goto end; } //bucket emulation ret2 = dpl_dict_add(headers_request, "X-Scality-Bucket", bucket, 0); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_req_gen_http_request(ctx, req, headers_request, NULL, header, sizeof (header), &header_len); if (DPL_SUCCESS != ret2) { ret = DPL_FAILURE; goto end; } iov[n_iov].iov_base = header; iov[n_iov].iov_len = header_len; n_iov++; //final crlf iov[n_iov].iov_base = "\r\n"; iov[n_iov].iov_len = 2; n_iov++; ret2 = dpl_conn_writev_all(conn, iov, n_iov, conn->ctx->write_timeout); if (DPL_SUCCESS != ret2) { DPLERR(1, "writev failed"); connection_close = 1; ret = DPL_ENOENT; //mapped to 404 goto end; } ret2 = dpl_read_http_reply(conn, 1, NULL, NULL, &headers_reply); if (DPL_SUCCESS != ret2) { if (DPL_ENOENT == ret2) { ret = DPL_ENOENT; goto end; } else { DPLERR(0, "read http answer failed"); connection_close = 1; ret = DPL_ENOENT; //mapped to 404 goto end; } } else { if (NULL != headers_reply) //possible if continue succeeded connection_close = dpl_connection_close(ctx, headers_reply); } (void) dpl_log_event(ctx, "DATA", "IN", data_len); if (NULL != connp) { *connp = conn; conn = NULL; //consume it } ret = DPL_SUCCESS; end: if (NULL != conn) { if (1 == connection_close) dpl_conn_terminate(conn); else dpl_conn_release(conn); } if (NULL != headers_reply) dpl_dict_free(headers_reply); if (NULL != headers_request) dpl_dict_free(headers_request); if (NULL != req) dpl_req_free(req); DPRINTF("ret=%d\n", ret); return ret; }