Kouhei Sutou
null+****@clear*****
Mon Dec 22 16:06:15 JST 2014
Kouhei Sutou 2014-12-22 16:06:15 +0900 (Mon, 22 Dec 2014) New Revision: e560a0394b9c1f4ff5d18fa7f41f2fa780ca4a9b https://github.com/groonga/groonga/commit/e560a0394b9c1f4ff5d18fa7f41f2fa780ca4a9b Message: groonga http: support HEAD Modified files: src/groonga.c Modified: src/groonga.c (+28 -16) =================================================================== --- src/groonga.c 2014-12-20 18:18:18 +0900 (3805f2e) +++ src/groonga.c 2014-12-22 16:06:15 +0900 (8f93d1f) @@ -680,6 +680,7 @@ h_output(grn_ctx *ctx, int flags, void *arg) ht_context *hc = (ht_context *)arg; grn_sock fd = hc->msg->u.fd; grn_obj header, head, foot, *outbuf = ctx->impl->outbuf; + grn_bool should_return_body = (hc->msg->header.qtype == 'G'); if (!(flags & GRN_CTX_TAIL)) { return; } GRN_TEXT_INIT(&header, 0); GRN_TEXT_INIT(&head, 0); @@ -710,18 +711,25 @@ h_output(grn_ctx *ctx, int flags, void *arg) { ssize_t ret, len; #ifdef WIN32 + int n_buffers; WSABUF wsabufs[4]; wsabufs[0].buf = GRN_TEXT_VALUE(&header); wsabufs[0].len = GRN_TEXT_LEN(&header); - wsabufs[1].buf = GRN_TEXT_VALUE(&head); - wsabufs[1].len = GRN_TEXT_LEN(&head); - wsabufs[2].buf = GRN_TEXT_VALUE(outbuf); - wsabufs[2].len = GRN_TEXT_LEN(outbuf); - wsabufs[3].buf = GRN_TEXT_VALUE(&foot); - wsabufs[3].len = GRN_TEXT_LEN(&foot); + n_buffers = 1; + len = GRN_TEXT_LEN(&header); + if (should_return_body) { + wsabufs[1].buf = GRN_TEXT_VALUE(&head); + wsabufs[1].len = GRN_TEXT_LEN(&head); + wsabufs[2].buf = GRN_TEXT_VALUE(outbuf); + wsabufs[2].len = GRN_TEXT_LEN(outbuf); + wsabufs[3].buf = GRN_TEXT_VALUE(&foot); + wsabufs[3].len = GRN_TEXT_LEN(&foot); + n_buffers += 3; + len += GRN_TEXT_LEN(&head) + GRN_TEXT_LEN(outbuf) + GRN_TEXT_LEN(&foot); + } { DWORD sent; - if (WSASend(fd, wsabufs, 4, &sent, 0, NULL, NULL) == SOCKET_ERROR) { + if (WSASend(fd, wsabufs, n_buffers, &sent, 0, NULL, NULL) == SOCKET_ERROR) { SERR("WSASend"); } ret = sent; @@ -732,24 +740,27 @@ h_output(grn_ctx *ctx, int flags, void *arg) msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_iov = msg_iov; - msg.msg_iovlen = 4; + msg.msg_iovlen = 1; msg.msg_control = NULL; msg.msg_controllen = 0; msg.msg_flags = 0; msg_iov[0].iov_base = GRN_TEXT_VALUE(&header); msg_iov[0].iov_len = GRN_TEXT_LEN(&header); - msg_iov[1].iov_base = GRN_TEXT_VALUE(&head); - msg_iov[1].iov_len = GRN_TEXT_LEN(&head); - msg_iov[2].iov_base = GRN_TEXT_VALUE(outbuf); - msg_iov[2].iov_len = GRN_TEXT_LEN(outbuf); - msg_iov[3].iov_base = GRN_TEXT_VALUE(&foot); - msg_iov[3].iov_len = GRN_TEXT_LEN(&foot); + len = GRN_TEXT_LEN(&header); + if (should_return_body) { + msg_iov[1].iov_base = GRN_TEXT_VALUE(&head); + msg_iov[1].iov_len = GRN_TEXT_LEN(&head); + msg_iov[2].iov_base = GRN_TEXT_VALUE(outbuf); + msg_iov[2].iov_len = GRN_TEXT_LEN(outbuf); + msg_iov[3].iov_base = GRN_TEXT_VALUE(&foot); + msg_iov[3].iov_len = GRN_TEXT_LEN(&foot); + msg.msg_iovlen += 3; + len += GRN_TEXT_LEN(&head) + GRN_TEXT_LEN(outbuf) + GRN_TEXT_LEN(&foot); + } if ((ret = sendmsg(fd, &msg, MSG_NOSIGNAL)) == -1) { SERR("sendmsg"); } #endif /* WIN32 */ - len = GRN_TEXT_LEN(&header) + GRN_TEXT_LEN(&head) + - GRN_TEXT_LEN(outbuf) + GRN_TEXT_LEN(&foot); if (ret != len) { GRN_LOG(&grn_gctx, GRN_LOG_NOTICE, "couldn't send all data (%" GRN_FMT_LLD "/%" GRN_FMT_LLD ")", @@ -1084,6 +1095,7 @@ do_htreq(grn_ctx *ctx, grn_msg *msg) grn_com_header *header = &msg->header; switch (header->qtype) { case 'G' : /* GET */ + case 'H' : /* HEAD */ do_htreq_get(ctx, msg); break; case 'P' : /* POST */ -------------- next part -------------- HTML����������������������������...Download