mod_http_upload: Treat file and network errors differently
This commit is contained in:
parent
c0d4d31b5b
commit
86236431b9
|
@ -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) ->
|
||||||
|
|
|
@ -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} ->
|
||||||
|
|
Loading…
Reference in New Issue