Compare commits

..

No commits in common. "f1ad05f78951b189e53b498bdeccd06fb5b9ccfa" and "c6328bd174996377c5ace033415cdeb0bbe2ab95" have entirely different histories.

3 changed files with 159 additions and 18 deletions

View File

@ -16,7 +16,7 @@
-module(dudeswave_app).
-behaviour(application).
-export([bootstrap/3, start/2, stop/1]).
-export([start/2, stop/1]).
-define(APPBUCKET, dudeswave).
-define(USERSBUCKET, dudes).
@ -27,24 +27,15 @@ start(_Type, StartArgs) ->
undefined -> undefined
end,
Inet = case application:get_env(inet) of
ipv4 -> inet;
undefined -> inet;
ipv6 -> inet6
end,
{ok, Port} = application:get_env(port),
Dispatch = cowboy_router:compile([
{'_', [
{"/user", dudeswave_user_handler, #{bucket => ?USERSBUCKET}},
{"/", dudeswave_handler, #{bucket => ?APPBUCKET}}
]}
{'_', [{"/user", dudeswave_user_handler, #{bucket => ?USERSBUCKET}}]},
{'_', [{"/", dudeswave_handler, #{bucket => ?APPBUCKET}}]}
]),
{ok, ListenerPid} = cowboy:start_tls(dudeswave_listener, [
{port, Port},
Inet,
{ip, Addr}
], #{env => #{dispatch => Dispatch}}),
@ -58,4 +49,4 @@ stop(_State) ->
%
% Bootstrap procedure to be completed
%
bootstrap(_Admin, _Password, _Nodes) -> ok.
bootstrap(_Bucket) -> ok.

124
storage/priv/mimes.txt Normal file
View File

@ -0,0 +1,124 @@
{".gmi", "text/gemini"}.
{".gmni", "text/gemini"}.
{".atom", "application/atom+xml"}.
{".woff", "application/font-woff"}.
{".jar", "application/java-archive"}.
{".war", "application/java-archive"}.
{".ear", "application/java-archive"}.
{".js", "application/javascript"}.
{".json", "application/json"}.
{".hqx", "application/mac-binhex40"}.
{".doc", "application/msword"}.
{".bin", "application/octet-stream"}.
{".exe", "application/octet-stream"}.
{".dll", "application/octet-stream"}.
{".deb", "application/octet-stream"}.
{".dmg", "application/octet-stream"}.
{".fs", "application/octet-stream"}.
{".iso", "application/octet-stream"}.
{".img", "application/octet-stream"}.
{".msi", "application/octet-stream"}.
{".msp", "application/octet-stream"}.
{".msm", "application/octet-stream"}.
{".pdf", "application/pdf"}.
{".ps", "application/postscript"}.
{".eps", "application/postscript"}.
{".ai", "application/postscript"}.
{".rss", "application/rss+xml"}.
{".rtf", "application/rtf"}.
{".m3u8", "application/vnd.apple.mpegurl"}.
{".kml", "application/vnd.google-earth.kml+xml"}.
{".kmz", "application/vnd.google-earth.kmz"}.
{".xls", "application/vnd.ms-excel"}.
{".eot", "application/vnd.ms-fontobject"}.
{".ppt", "application/vnd.ms-powerpoint"}.
{".odc", "application/vnd.oasis.opendocument.chart"}.
{".otc", "application/vnd.oasis.opendocument.chart-template"}.
{".odb", "application/vnd.oasis.opendocument.database"}.
{".odf", "application/vnd.oasis.opendocument.formula"}.
{".otf", "application/vnd.oasis.opendocument.formula-template"}.
{".odg", "application/vnd.oasis.opendocument.graphics"}.
{".otg", "application/vnd.oasis.opendocument.graphics-template"}.
{".odi", "application/vnd.oasis.opendocument.image"}.
{".oti", "application/vnd.oasis.opendocument.image-template"}.
{".odp", "application/vnd.oasis.opendocument.presentation"}.
{".otp", "application/vnd.oasis.opendocument.presentation-template"}.
{".ods", "application/vnd.oasis.opendocument.spreadsheet"}.
{".ots", "application/vnd.oasis.opendocument.spreadsheet-template"}.
{".odt", "application/vnd.oasis.opendocument.text"}.
{".odm", "application/vnd.oasis.opendocument.text-master"}.
{".ott", "application/vnd.oasis.opendocument.text-template"}.
{".oth", "application/vnd.oasis.opendocument.text-web"}.
{".wmlc", "application/vnd.wap.wmlc"}.
{".7z", "application/x-7z-compressed"}.
{".cco", "application/x-cocoa"}.
{".jardiff", "application/x-java-archive-diff"}.
{".jnlp", "application/x-java-jnlp-file"}.
{".run", "application/x-makeself"}.
{".pac", "application/x-ns-proxy-autoconfig"}.
{".pl", "application/x-perl"}.
{".pm", "application/x-perl"}.
{".prc", "application/x-pilot"}.
{".pdb", "application/x-pilot"}.
{".rar", "application/x-rar-compressed"}.
{".rpm", "application/x-redhat-package-manager"}.
{".sea", "application/x-sea"}.
{".swf", "application/x-shockwave-flash"}.
{".sit", "application/x-stuffit"}.
{".tcl", "application/x-tcl"}.
{".tk", "application/x-tcl"}.
{".der", "application/x-x509-ca-cert"}.
{".pem", "application/x-x509-ca-cert"}.
{".crt", "application/x-x509-ca-cert"}.
{".xpi", "application/x-xpinstall"}.
{".xhtml", "application/xhtml+xml"}.
{".zip", "application/zip"}.
{".ez", "application/zip"}.
{".au", "audio/basic"}.
{".snd", "audio/basic"}.
{".mid", "audio/midi"}.
{".midi", "audio/midi"}.
{".kar", "audio/midi"}.
{".mp3", "audio/mpeg"}.
{".ogg", "audio/ogg"}.
{".m4a", "audio/x-m4a"}.
{".ra", "audio/x-realaudio"}.
{".gif", "image/gif"}.
{".jpeg", "image/jpeg"}.
{".jpg", "image/jpeg"}.
{".png", "image/png"}.
{".svg", "image/svg+xml"}.
{".svgz", "image/svg+xml"}.
{".tif", "image/tiff"}.
{".tiff", "image/tiff"}.
{".wbmp", "image/vnd.wap.wbmp"}.
{".webp", "image/webp"}.
{".ico", "image/x-icon"}.
{".jng", "image/x-jng"}.
{".bmp", "image/x-ms-bmp"}.
{".css", "text/css"}.
{".html", "text/html"}.
{".htm", "text/html"}.
{".shtml", "text/html"}.
{".mml", "text/mathml"}.
{".txt", "text/plain"}.
{".jad", "text/vnd.sun.j2me.app-descriptor"}.
{".wml", "text/vnd.wap.wml"}.
{".htc", "text/x-component"}.
{".xml", "text/xml"}.
{".3gpp", "video/3gpp"}.
{".3gp", "video/3gpp"}.
{".ts", "video/mp2t"}.
{".mp4", "video/mp4"}.
{".mpeg", "video/mpeg"}.
{".mpg", "video/mpeg"}.
{".mov", "video/quicktime"}.
{".webm", "video/webm"}.
{".flv", "video/x-flv"}.
{".m4v", "video/x-m4v"}.
{".mkv", "video/x-matroska"}.
{".mng", "video/x-mng"}.
{".asx", "video/x-ms-asf"}.
{".asf", "video/x-ms-asf"}.
{".wmv", "video/x-ms-wmv"}.
{".avi", "video/x-msvideo"}.

View File

@ -66,10 +66,15 @@ file:
-include_lib("stdlib/include/qlc.hrl").
-include_lib("storage/include/storage.hrl").
-define(MIMEFILE, "/mimes.txt").
-define(DEFMIME, "application/octect-stream").
-type object() :: #object{}.
-type metadata() :: [{atom(), term()}].
-export_type([object/0, metadata/0]).
-record(mime, {ext, mtype}).
%
% Start functions.
%
@ -484,11 +489,11 @@ Objs.
[#object{key = o1,
tags = [foo, bar],
value = {ipse, dixit},
metadata = [{tags, [foo, bar]}]
metadata = [{tags, [foo, bar]},{mime, 'application/octect-stream'}]
}, #object{key = o2,
tags = [foo, bar],
value = 42,
metadata = [{tags, [foo, bar]}]
metadata = [{tags, [foo, bar]},{mime, 'application/octect-stream'}]
}
]
@ -520,7 +525,7 @@ Example:
{ok, [R]} = read(objects, foo).
R.
#object{key = o1,value = {ipse, dixit},
metadata = [{tags, [foo, bar]}]
metadata = [{tags, [foo, bar]},{mime, 'application/octet-stream'}]}
```
""".
-spec read(Bucket, Key) -> {ok, Record} | {error, Reason} when
@ -599,9 +604,23 @@ code_change(_OldVsn, N, _Extra) -> {ok, N}.
init([]) ->
process_flag(trap_exit, true),
mnesia:create_table(mime, [{attributes, record_info(fields, mime)},
{ram_copies, [node()]}, {local_content, true}]),
F= fun() ->
{ok, App} = application:get_application(?MODULE),
{ok, M} = file:consult(lists:append(code:priv_dir(App), ?MIMEFILE)),
[mnesia:write(#mime{ext = E, mtype = T}) || {E, T} <- M]
end,
mnesia:transaction(F),
{ok, 0}.
terminate(_Reason, _N) -> ok.
terminate(_Reason, _N) ->
mnesia:delete_table(mime),
ok.
%
% Bucket operations callbacks.
@ -708,8 +727,15 @@ handle_call({write, Bucket, Key, Term}, _From, State) ->
handle_call({write, Bucket, Key, Term, []}, _From, State);
handle_call({write, Bucket, Key, Term, Metadata}, _From, State) ->
Ex = filename:extension(Key),
F = fun() ->
R = #object{key = Key, value = Term, metadata = Metadata},
M = case mnesia:read(mime, Ex) of
[] -> ?DEFMIME;
[Mt] -> Mt#mime.mtype
end,
R = #object{key = Key, value = Term, metadata = lists:flatten([{mime, M}, Metadata])},
mnesia:write(Bucket, R, write)
end,