From 0bebd77d4dbbbec44719cddda8f01805c4f9ee00 Mon Sep 17 00:00:00 2001 From: Joan Touzet Date: Wed, 29 Jan 2020 12:03:06 -0500 Subject: [PATCH 1/3] Fix node-specific shard access via HTTP --- src/chttpd/src/chttpd_node.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chttpd/src/chttpd_node.erl b/src/chttpd/src/chttpd_node.erl index acd5affbdee..499eb16fff1 100644 --- a/src/chttpd/src/chttpd_node.erl +++ b/src/chttpd/src/chttpd_node.erl @@ -132,7 +132,7 @@ handle_node_req(#httpd{path_parts=[_, Node | PathParts], % strip /_node/{node} from Req0 before descending further RawUri = MochiReq0:get(raw_path), {_, Query, Fragment} = mochiweb_util:urlsplit_path(RawUri), - NewPath0 = "/" ++ lists:join("/", [?b2l(P) || P <- PathParts]), + NewPath0 = "/" ++ lists:join("/", [couch_util:url_encode(P) || P <- PathParts]), NewRawPath = mochiweb_util:urlunsplit_path({NewPath0, Query, Fragment}), MaxSize = config:get_integer("httpd", "max_http_request_size", 4294967296), NewOpts = [{body, MochiReq0:recv_body(MaxSize)} | MochiReq0:get(opts)], From feb2d8f91948db384f9ae553982b95884518fa07 Mon Sep 17 00:00:00 2001 From: Nick Vatamaniuc Date: Wed, 29 Jan 2020 17:25:35 -0500 Subject: [PATCH 2/3] Fix attachment reading from _node/_local shards It just needed a few clauses in send and recv_loop it turns out. --- src/chttpd/src/chttpd_node.erl | 5 +++++ src/couch/src/couch_httpd.erl | 3 +++ 2 files changed, 8 insertions(+) diff --git a/src/chttpd/src/chttpd_node.erl b/src/chttpd/src/chttpd_node.erl index 499eb16fff1..033abd68d8b 100644 --- a/src/chttpd/src/chttpd_node.erl +++ b/src/chttpd/src/chttpd_node.erl @@ -154,12 +154,17 @@ recv_loop(Ref, ReqResp) -> receive {Ref, Code, Headers, _Args, start_response} -> recv_loop(Ref, ReqResp:start({Code, Headers})); + {Ref, Code, Headers, Len, start_response_length} -> + recv_loop(Ref, ReqResp:start_response_length({Code, Headers, Len})); {Ref, Code, Headers, chunked, respond} -> Resp = ReqResp:respond({Code, Headers, chunked}), recv_loop(Ref, Resp); {Ref, Code, Headers, Args, respond} -> Resp = ReqResp:respond({Code, Headers, Args}), {ok, Resp}; + {Ref, send, Data} -> + ReqResp:send(Data), + {ok, ReqResp}; {Ref, chunk, <<>>} -> ReqResp:write_chunk(<<>>), {ok, ReqResp}; diff --git a/src/couch/src/couch_httpd.erl b/src/couch/src/couch_httpd.erl index 872b556cf8b..ef90d6b2ad0 100644 --- a/src/couch/src/couch_httpd.erl +++ b/src/couch/src/couch_httpd.erl @@ -720,6 +720,9 @@ start_response(#httpd{mochi_req=MochiReq}=Req, Code, Headers0) -> end, {ok, Resp}. +send({remote, Pid, Ref} = Resp, Data) -> + Pid ! {Ref, send, Data}, + {ok, Resp}; send(Resp, Data) -> Resp:send(Data), {ok, Resp}. From 674683a7cfad4b5befd5a9002a31015b9b760a3f Mon Sep 17 00:00:00 2001 From: Joan Touzet Date: Fri, 31 Jan 2020 19:02:10 -0500 Subject: [PATCH 3/3] Enable per-view-shard access --- src/couch/src/couch_httpd_db.erl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/couch/src/couch_httpd_db.erl b/src/couch/src/couch_httpd_db.erl index 1a07b202caf..2418c1a4c1a 100644 --- a/src/couch/src/couch_httpd_db.erl +++ b/src/couch/src/couch_httpd_db.erl @@ -199,9 +199,15 @@ handle_design_req(#httpd{ false -> ok end, - % load ddoc + % maybe load ddoc through fabric DesignId = <<"_design/", DesignName/binary>>, - DDoc = couch_httpd_db:couch_doc_open(Db, DesignId, nil, [ejson_body]), + case couch_httpd_db:couch_doc_open(Db, DesignId, nil, [ejson_body]) of + not_found -> + DbName = mem3:dbname(couch_db:name(Db)), + {ok, DDoc} = fabric:open_doc(DbName, DesignId, [?ADMIN_CTX]); + DDoc -> + ok + end, Handler = couch_util:dict_find(Action, DesignUrlHandlers, fun(_, _, _) -> throw({not_found, <<"missing handler: ", Action/binary>>}) end),