summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Smith (work) <jhs@iriscouch.com>2013-02-12 16:03:12 +0000
committerJason Smith (work) <jhs@iriscouch.com>2013-02-12 16:03:12 +0000
commitb7eb2af759d06533844507719756d4533db2f1b3 (patch)
treed18ff0f9490e8a81f86df5512cfdc042d0bd3eb3
parenta02acbec336069069b0d66f01c38236a07ecfd51 (diff)
downloadcouchdb-b7eb2af759d06533844507719756d4533db2f1b3.tar.gz
A /_nodejs handler to forward to the node app
-rw-r--r--etc/couchdb/default.ini.tpl.in1
-rw-r--r--src/couchdb/Makefile.am2
-rw-r--r--src/couchdb/couch_httpd_nodejs.erl121
3 files changed, 124 insertions, 0 deletions
diff --git a/etc/couchdb/default.ini.tpl.in b/etc/couchdb/default.ini.tpl.in
index a2cdf4937..865ec85a4 100644
--- a/etc/couchdb/default.ini.tpl.in
+++ b/etc/couchdb/default.ini.tpl.in
@@ -158,6 +158,7 @@ _log = {couch_httpd_misc_handlers, handle_log_req}
_session = {couch_httpd_auth, handle_session_req}
_oauth = {couch_httpd_oauth, handle_oauth_req}
_debug = {couch_httpd_debug, handle_debug_req}
+_nodejs = {couch_httpd_nodejs, handle_node_req}
[httpd_db_handlers]
_all_docs = {couch_mrview_http, handle_all_docs_req}
diff --git a/src/couchdb/Makefile.am b/src/couchdb/Makefile.am
index fd86d5956..110f9e65b 100644
--- a/src/couchdb/Makefile.am
+++ b/src/couchdb/Makefile.am
@@ -51,6 +51,7 @@ source_files = \
couch_httpd_auth.erl \
couch_httpd_cors.erl \
couch_httpd_debug.erl \
+ couch_httpd_nodejs.erl \
couch_httpd_oauth.erl \
couch_httpd_external.erl \
couch_httpd_misc_handlers.erl \
@@ -110,6 +111,7 @@ compiled_files = \
couch_httpd_oauth.beam \
couch_httpd_cors.beam \
couch_httpd_debug.beam \
+ couch_httpd_nodejs.beam \
couch_httpd_proxy.beam \
couch_httpd_external.beam \
couch_httpd_misc_handlers.beam \
diff --git a/src/couchdb/couch_httpd_nodejs.erl b/src/couchdb/couch_httpd_nodejs.erl
new file mode 100644
index 000000000..fc149832c
--- /dev/null
+++ b/src/couchdb/couch_httpd_nodejs.erl
@@ -0,0 +1,121 @@
+% Licensed under the Apache License, Version 2.0 (the "License"); you may not
+% use this file except in compliance with the License. You may obtain a copy of
+% the License at
+%
+% http://www.apache.org/licenses/LICENSE-2.0
+%
+% Unless required by applicable law or agreed to in writing, software
+% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+% License for the specific language governing permissions and limitations under
+% the License.
+
+-module(couch_httpd_nodejs).
+-include("couch_db.hrl").
+
+-export([handle_node_req/1]).
+
+-import(couch_httpd, [header_value/2, send_method_not_allowed/2]).
+
+
+handle_node_req(#httpd{}=Req) -> ok
+ , couch_httpd:send_json(Req, 200, {[ {ok,true}, {todo,true} ]}).
+
+%handle_git_req(#httpd{method='GET', path_parts=[_Debug, Pid | _Rest]=Path}=Req) -> ok
+% , ok = couch_httpd:verify_is_server_admin(Req)
+% %, io:format("Must look up: ~p for: ~p\n", [Pid, Path])
+% , Procs = couch_query_servers:git_ports("javascript")
+% , case lists:keyfind(Pid, 1, Procs)
+% of {Pid, Port} -> ok
+% % Proxy to socket.io. Use the normal httpd_proxy for everything except the
+% % websockets request.
+% , InspectorPort = Port + 1
+% , case Path
+% of [<<"_git">>, Pid, <<"socket.io">>, <<"1">>, <<"websocket">>, _Key] -> ok
+% , relay(Req, InspectorPort)
+% ; _ -> ok
+% , Url = io_lib:format("http://127.0.0.1:~w/_git/", [InspectorPort])
+% %, io:format("Proxy: ~p\nPath = ~p\n", [Url, Path])
+% , couch_httpd_proxy:handle_proxy_req(Req, ?l2b(Url))
+% end
+% ; false -> ok
+% , io:format("No such pid: ~p\n", [Pid])
+% , couch_httpd:send_json(Req, 404, {[ {error,pid_not_found}, {pid,Pid} ]})
+% end
+% ;
+%
+%handle_git_req(Req) -> ok
+% , send_method_not_allowed(Req, "GET")
+% .
+%
+%relay(Req, Port) when is_integer(Port) -> ok
+% , io:format("socket.io connection to port ~w\n", [Port])
+% , case gen_tcp:connect("127.0.0.1", Port, [binary, {packet,0}, {active,false}])
+% of {ok, InspectorSocket} -> ok
+% , io:format("Connected to inspector on :~w\n", [Port])
+% , relay(Req, InspectorSocket)
+% ; {error, Error} -> ok
+% , Resp = {[ {error,inspector_proxy}, {result, Error} ]}
+% , couch_httpd:send_json(Req, 502, Resp)
+% end
+% ;
+%
+%relay(#httpd{mochi_req=MochiReq}=Req, InspectorSocket) -> ok
+% , Client = MochiReq:get(socket)
+% , ReqBytes = request_to_iolist(Req)
+% , Size = iolist_size(ReqBytes)
+% , io:format("Send ~w byte request to inspector\n", [Size])
+% , ok = gen_tcp:send(InspectorSocket, ReqBytes)
+% , relay(Client, InspectorSocket, Size, 0)
+% .
+%
+%relay(Client, Remote, FromClient, FromRemote) -> ok
+% %, io:format("Relay client=~w remote=~w\n", [FromClient, FromRemote])
+% , inet:setopts(Client, [{packet,0}, {active,once}, {nodelay,true} ])
+% , inet:setopts(Remote, [{packet,0}, {active,once}, {nodelay,true} ])
+% , receive
+% {_Type, Client, Data} -> ok
+% %, io:format("Client: ~p\n", [Data])
+% , gen_tcp:send(Remote, Data)
+% , relay(Client, Remote, FromClient + size(Data), FromRemote)
+% ; {_Type, Remote, Data} -> ok
+% %, io:format("Remote ~w bytes: ~p\n", [size(Data), Data])
+% , gen_tcp:send(Client, Data)
+% , relay(Client, Remote, FromClient, FromRemote + size(Data))
+% ; {tcp_closed, Client} -> ok
+% , io:format("Client disconnected\n")
+% , gen_tcp:close(Remote)
+% , {ok, ok}
+% ; {tcp_closed, Remote} -> ok
+% % XXX
+% , io:format("Remote disconnected\n")
+% %, gen_tcp:controlling_process(Remote)
+% %, catch Owner ! {stream_close, bad_reqid}
+% , gen_tcp:close(Client)
+% %, {ok, FromClient, FromRemote}
+% , {ok, ok}
+% ; Else -> ok
+% , ?LOG_ERROR("Relay error: ~p", [Else])
+% end
+% %, couch_httpd:send_json(Req, 200, {[ {ok,true}, {todo,<<"To do">>} ]})
+% .
+%
+%request_to_iolist(#httpd{method=Method, mochi_req=MochiReq}) -> ok
+% , Path = MochiReq:get(raw_path)
+% , Version = case MochiReq:get(version)
+% of {1,1} -> "1.1"
+% ; _ -> "1.0"
+% end
+% , Action = io_lib:format("~s ~s HTTP/~s", [Method, Path, Version])
+% , MochiHeaders = mochiweb_headers:to_list(MochiReq:get(headers))
+% , Headers = [ [couch_util:to_binary(Key), ": ", Val, "\r\n"] || {Key, Val} <- MochiHeaders]
+% , [Action, "\r\n", Headers, "\r\n"]
+% .
+
+
+%
+% Utilities
+%
+
+
+% vim: sts=4 sw=4 et