You are doing something wrong. I’ve just checked and it works:
$ curl -v -X PUT -H 'Content-Type: application/json' http://node.avsej.net:8092/default/_design/blog -d'{"_id":"_design/blog","language":"javascript","views":{"recent_posts":{"map":"function(doc){if(doc.date&&doc.title){emit(doc.date,doc.title);}}"}}}'
* About to connect() to node.avsej.net port 8092 (#0)
* Trying 50.116.6.84...
* Adding handle: conn: 0xa51e10
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0xa51e10) send_pipe: 1, recv_pipe: 0
* Connected to node.avsej.net (50.116.6.84) port 8092 (#0)
> PUT /default/_design/blog HTTP/1.1
> User-Agent: curl/7.31.0
> Host: node.avsej.net:8092
> Accept: */*
> Content-Type: application/json
> Content-Length: 147
>
* upload completely sent off: 147 out of 147 bytes
< HTTP/1.1 201 Created
* Server MochiWeb/1.0 (Any of you quaids got a smint?) is not blacklisted
< Server: MochiWeb/1.0 (Any of you quaids got a smint?)
< Location: http://node.avsej.net:8092/default/_design/blog
< Date: Thu, 25 Jul 2013 05:40:42 GMT
< Content-Type: text/plain;charset=utf-8
< Content-Length: 32
< Cache-Control: must-revalidate
<
{"ok":true,"id":"_design/blog"}
* Connection #0 to host node.avsej.net left intact
Also example, based on lcb_make_http_request manpage works well too:
#include
#include
#include
#include
static void error_callback(lcb_t instance, lcb_error_t error, const char *errinfo)
{
fprintf(stderr, "ERROR: %s (0x%x), %s\n", lcb_strerror(instance, error), error, errinfo);
exit(EXIT_FAILURE);
}
static void complete_callback(lcb_http_request_t req, lcb_t instance,
const void *cookie, lcb_error_t error,
const lcb_http_resp_t *resp)
{
size_t ii;
if (resp->v.v0.headers) {
const char *const *headers = resp->v.v0.headers;
for (ii = 1; *headers != NULL; ++ii, ++headers) {
fprintf(stderr, "%s%s", *headers, (ii % 2 == 0) ? "\n" : ": ");
}
}
fprintf(stderr, "\"");
fwrite(resp->v.v0.path, sizeof(char), resp->v.v0.npath, stderr);
fprintf(stderr, "\": ");
if (error == LCB_SUCCESS) {
fprintf(stderr, "OK Size: %d", (int)resp->v.v0.nbytes);
fwrite(resp->v.v0.bytes, sizeof(char), resp->v.v0.nbytes, stdout);
} else {
fprintf(stderr, "FAIL(%d) %s Status:%d Size:%d\n",
error, lcb_strerror(instance, error),
resp->v.v0.status, (int)resp->v.v0.nbytes);
}
fwrite(resp->v.v0.bytes, sizeof(char), resp->v.v0.nbytes, stdout);
fprintf(stderr, "\n");
(void)req;
(void)cookie;
}
int main(int argc, char *argv[])
{
lcb_error_t err;
lcb_t instance;
struct lcb_create_st create_options;
memset(&create_options, 0, sizeof(create_options));
create_options.v.v0.host = "node.avsej.net:8091";
create_options.v.v0.bucket = "default";
create_options.v.v0.user = NULL;
create_options.v.v0.passwd = NULL;
err = lcb_create(&instance, &create_options);
if (err != LCB_SUCCESS) {
fprintf(stderr, "Failed to create libcouchbase instance: %s\n", lcb_strerror(NULL, err));
return 1;
}
(void)lcb_set_error_callback(instance, error_callback);
/* Initiate the connect sequence in libcouchbase */
if ((err = lcb_connect(instance)) != LCB_SUCCESS) {
fprintf(stderr, "Failed to initiate connect: %s\n", lcb_strerror(NULL, err));
lcb_destroy(instance);
return 1;
}
(void)lcb_set_http_complete_callback(instance, complete_callback);
/* Run the event loop and wait until we've connected */
lcb_wait(instance);
{
const char docid[] = "_design/test2";
const char doc[] = "{\"views\":{\"all\":{\"map\":\"function (doc, meta) { emit(meta.id, null); }\"}}}";
lcb_http_cmd_t cmd;
lcb_http_request_t req;
lcb_error_t err;
cmd.version = 0;
cmd.v.v0.path = docid;
cmd.v.v0.npath = strlen(docid);
cmd.v.v0.body = doc;
cmd.v.v0.nbody = strlen(doc);
cmd.v.v0.method = LCB_HTTP_METHOD_PUT;
cmd.v.v0.content_type = "application/json";
err = lcb_make_http_request(instance, NULL, LCB_HTTP_TYPE_VIEW, &cmd, &req);
if (err != LCB_SUCCESS) {
fprintf(stderr, "Failed to schedule HTTP request: %s\n", lcb_strerror(instance, err));
lcb_destroy(instance);
return 1;
}
lcb_wait(instance);
}
lcb_destroy(instance);
return 0;
}