mod_http_upload: Treat file and network errors differently

This commit is contained in:
Evgeniy Khramtsov 2018-07-04 08:55:52 +03:00
parent c0d4d31b5b
commit 86236431b9
2 changed files with 31 additions and 25 deletions

View File

@ -598,35 +598,37 @@ recv_file(#request{length = Len, data = Trail,
sockmod = SockMod, socket = Socket}, Path) -> sockmod = SockMod, socket = Socket}, Path) ->
case file:open(Path, [write, exclusive, raw]) of case file:open(Path, [write, exclusive, raw]) of
{ok, Fd} -> {ok, Fd} ->
case file:write(Fd, Trail) of Res = case file:write(Fd, Trail) of
ok -> ok ->
NewLen = max(0, Len - byte_size(Trail)), NewLen = max(0, Len - byte_size(Trail)),
case do_recv_file(NewLen, SockMod, Socket, Fd) of do_recv_file(NewLen, SockMod, Socket, Fd);
ok -> {error, _} = Err ->
ok; Err
{error, _} = Err -> end,
file:delete(Path), file:close(Fd),
Err case Res of
end; ok -> ok;
{error, _} = Err -> {error, _} -> file:delete(Path)
file:delete(Path), end,
Err Res;
end;
{error, _} = Err -> {error, _} = Err ->
Err Err
end. end.
do_recv_file(0, _SockMod, _Socket, Fd) -> do_recv_file(0, _SockMod, _Socket, _Fd) ->
file:close(Fd); ok;
do_recv_file(Len, SockMod, Socket, Fd) -> do_recv_file(Len, SockMod, Socket, Fd) ->
ChunkLen = min(Len, ?RECV_BUF), ChunkLen = min(Len, ?RECV_BUF),
try case SockMod:recv(Socket, ChunkLen, timer:seconds(30)) of
{ok, Data} = SockMod:recv(Socket, ChunkLen, timer:seconds(30)), {ok, Data} ->
ok = file:write(Fd, Data), case file:write(Fd, Data) of
do_recv_file(Len-size(Data), SockMod, Socket, Fd) ok ->
catch _:{badmatch, {error, _} = Err} -> do_recv_file(Len-size(Data), SockMod, Socket, Fd);
file:close(Fd), {error, _} = Err ->
Err Err
end;
{error, _} ->
{error, closed}
end. end.
make_headers(State, Status, Reason, Headers, Data) -> make_headers(State, Status, Reason, Headers, Data) ->

View File

@ -390,9 +390,13 @@ process(_LocalPath, #request{method = 'PUT', host = Host, ip = IP,
http_response(201, CustomHeaders); http_response(201, CustomHeaders);
{ok, Headers, OutData} -> {ok, Headers, OutData} ->
http_response(201, Headers ++ CustomHeaders, OutData); http_response(201, Headers ++ CustomHeaders, OutData);
{error, closed} ->
?DEBUG("Cannot store file ~s from ~s for ~s: connection closed",
[Path, ?ADDR_TO_STR(IP), Host]),
http_response(404);
{error, Error} -> {error, Error} ->
?INFO_MSG("Cannot store file ~s from ~s for ~s: ~s", ?ERROR_MSG("Cannot store file ~s from ~s for ~s: ~s",
[Path, ?ADDR_TO_STR(IP), Host, format_error(Error)]), [Path, ?ADDR_TO_STR(IP), Host, format_error(Error)]),
http_response(500) http_response(500)
end; end;
{error, size_mismatch} -> {error, size_mismatch} ->