簡體   English   中英

upload.yaws因erlang R16B-03.7.el7和yaws 1.98-2.el7而失敗

[英]upload.yaws fails with erlang R16B-03.7.el7 and yaws 1.98-2.el7

我需要幫助。 我有一個正常的網站。 上線之前的最后一步是更新ssl證書。 由於那個版本的erlang中的一個錯誤,這沒有發生。 我升級了erlang,然后在erlang和yaws驅動程序之間的代碼級別不匹配。 我卸載並編譯了偏航船,令我感到非常高興的是,我能夠更新ssl證書。 開始推出后,用戶指出上傳功能不起作用。 我驗證了它仍然可以與不接受ssl cert的版本一起使用。 我以為問題出在構建過程中,所以我從新發行的CentOS 7 VM以及該發行版中的erlang和Yaws重新開始。 同樣的問題。 看來我可以上載或新證書,但不能同時擁有。 我的上傳版本是對std upload.yaws的略微修改。 但是,我把它撿起來並嘗試了。 它也失敗了。 以下是軟件級別,失敗的代碼和崩潰數據。

任何幫助將不勝感激。

________代碼_____________________________________________________________________________________ CentOS 3.10.0-123.6.3.el7.x86_64 erlang.x86_64 R16B-03.7.el7 @epel yaws.x86_64 1.98-2.el7 @epel

_碼____________________________________________________________________________________________________________________________

 -record(upload, { % represents state for a partially processed upload
      fd,
      filename,
      last}).

-define(DIR, "/var/lib/yaws/www/cwfiles/").

showup(List) -> % Adds the rows of files from the DB
    [{tr,[],[
        {th,[], "File Name"}
    ]},
    map(fun(Y) ->  {TFid,FName} = Y, [
        {tr,[],[
                {td,[], [{input, [{type,text},{name,"Filename"},{value,FName}]}]},
            {td,[], [{a,[{href,["dpagepost.yaws?action=delf&    fid=",integer_to_list(TFid),"&fname=",[FName]]}],"Delete File"}]}
        ]}
    ] end, List)].

upload(A) -> upload(A,[]).
upload(A, Comment) ->
Css = css_head(A,on,57),
    Body = case getadmen(A) of
        true ->
            Ref=dbconnect(),
            {selected,_,LFil} = odbc:sql_query(Ref,"select fid,filename from files"),
            odbc:disconnect(Ref),
            {ehtml, [
                {h2, [], "Update Files (Upload/Delete)"},
                {hr},
                {h3,[], [Comment]},
                {hr},
                {table, [], [
                    showup(LFil) % Do rows from DB
                ]}, %end table
                {hr},
                {form, [{enctype, "multipart/form-data"},{action,"    /dpagepost.yaws?action=addf"},{method,post}],[
                    {input, [{type,file},{name,"fname"},{width,"50"},{value,"Upload"}]},
                    {input, [{type,submit},{value,"Upload"}]}           
                ]}
            ]};
        _ ->
            {ehtml, [
                {h2, [], "Unvalid Action. Please insure you are Admin Enabled"},
                {hr}
            ]}
    end, 
    [Css, Body, bot(), break].


%%% Process POST data from client, state=#upload
%%% returns Ehtml | {get_more, Continuation, NewState}
uploadpost(A) ->
CAdmen = getadmen(A),
case {yaws_api:queryvar(A,"action"),CAdmen} of
    {{ok, Action},true} -> Action;
    _ -> Action = ""  
end,
case Action of    
    "addf" ->
        State = case A#arg.state of
            undefined -> #upload{};
        _    -> A#arg.state
        end,
        multipart(A, State);
    "delf" ->
        case {yaws_api:queryvar(A, "fid"),yaws_api:queryvar(A, "fname"),CAdmen} of
    {{ok,LFid},{ok,LFname},true} ->
                {NFid,_} = string:to_integer(LFid),
                Fname = string:strip(LFname),
                SQL = "delete from files where fid=?",
                Ref=dbconnect(),
                odbc:param_query(Ref,SQL,[{sql_integer, [NFid]}]),
                odbc:disconnect(Ref),
                case file:delete(concat(?DIR,Fname)) of
                    ok ->
                        upload(A,"File Delete sucessfull.");
                    _ ->     upload(A,"File Delete Failed.")
                end;               
            _ -> upload(A,"You performed an invalid Action.")
        end;       
    _ -> upload(A,"You performed an invalid Action.")
end.   

err() -> "error".


multipart(A, State) ->
Admen = getadmen(A),
Parse = yaws_api:parse_multipart_post(A),
case {Parse,Admen} of
    {{cont, Cont, Res},true} ->
        case addFileChunk(A, Res, State) of
            {done, Result} ->
         upload(A,Result);
            {cont, NewState} ->
                {get_more, Cont, NewState}
        end;
    {{result, Res},true} ->
        case addFileChunk(A, Res, State#upload{last=true}) of
            {done, Result} ->
                upload(A,Result);
            {cont, _} ->
                upload(A,"Upload failed")
        end;
    _ ->
        upload(A,"Upload failed")
end.

addFileChunk(A, [{part_body, Data}|Res], State) ->
addFileChunk(A, [{body, Data}|Res], State);
addFileChunk(_A, [], State) when State#upload.last==true,State#upload.filename /=   undefined,State#upload.fd /= undefined ->
file:close(State#upload.fd),
SQL = "insert into files (filename) values ( ?)",
Ref=dbconnect(),
odbc:param_query(Ref,SQL,[{{sql_varchar, 50}, [State#upload.filename]}]),
odbc:disconnect(Ref),
{done,"Upload Completed Sucessfully."};
addFileChunk(_A, [], State) when State#upload.last==true ->
{done, err()};
addFileChunk(_A, [], State) ->
{cont, State};
addFileChunk(A, [{head, {_Name, Opts}}|Res], State ) ->
case lists:keysearch(filename, 1, Opts) of
  {value, {_, Fname0}} ->
    Fname = yaws_api:sanitize_file_name(filename:basename(Fname0)),
        %file:make_dir(?DIR),
    case file:open([?DIR, Fname] ,[write]) of
            {ok, Fd} ->
                 S2 = State#upload{filename = Fname,fd = Fd},
                addFileChunk(A, Res, S2);
            _ ->
                {done, err()}
    end;
    false -> addFileChunk(A,Res,State)
end;
addFileChunk(A, [{body, Data}|Res], State) when State#upload.filename /= undefined ->
case file:write(State#upload.fd, Data) of
  ok ->
      addFileChunk(A, Res, State);
  _ ->
      {done, err()}
end.`

_________崩潰數據_________________內部錯誤, 偏轉代碼崩潰

ERROR erlang code threw an uncaught exception:
File: /var/lib/yaws/www/dpagepost.yaws:1
Class: error
Exception: function_clause
Req: {http_request,'POST',{abs_path,"/dpagepost.yaws?action=addf"},{1,1}}
Stack: [{cwpage,addFileChunk,
        [{arg,
             {ssl,
                 {sslsocket,
                     {gen_tcp,#Port<0.1480>,tls_connection},
                     <0.73.0>}},
             {{192,168,0,133},54630},
             {headers,"keep-alive",
                 "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
                 "192.168.0.190",undefined,undefined,undefined,undefined,
                 undefined,undefined,"https://192.168.0.190/upload.yaws",
                 "Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0",
                 undefined,
                 ["__atuvc=30%7C35; cwhoa_sid=nonode@nohost-211833414978628805947952202420298501124"],
                 undefined,undefined,"229",
                 "multipart/form-data;  boundary=---------------------------501916758553745487488260262",
                 undefined,undefined,undefined,undefined,
                 [{http_header,10,'Accept-Encoding',undefined,
                      "gzip, deflate"},
                  {http_header,11,'Accept-Language',undefined,
                      "en-US,en;q=0.5"}]},
             {http_request,'POST',
                 {abs_path,"/dpagepost.yaws?action=addf"},
                 {1,1}},
             {http_request,'POST',
                 {abs_path,"/dpagepost.yaws?action=addf"},
                 {1,1}},
             <<"-----------------------------501916758553745487488260262\r\nContent-Disposition: form-data; name=\"fname\"; filename=\"Hello.txt\"\r\nContent-Type: text/plain\r\n\r\nHello, World\n\r\n-----------------------------501916758553745487488260262--\r\n">>,
             "/dpagepost.yaws","action=addf",undefined,
             "/var/lib/yaws/www","/","/var/lib/yaws/www/dpagepost.yaws",
             undefined,undefined,<0.72.0>,[],undefined,"/",undefined},
         [{body,"Hello, World\n"}],
         {upload,undefined,undefined,true}],
        [{file,"cwpage.erl"},{line,239}]},
    {cwpage,multipart,2,[{file,"cwpage.erl"},{line,209}]},
    {yaws_server,deliver_dyn_part,8,
        [{file,"yaws_server.erl"},{line,2801}]},
    {yaws_server,aloop,4,[{file,"yaws_server.erl"},{line,1215}]},
    {yaws_server,acceptor0,2,[{file,"yaws_server.erl"},{line,1052}]},
    {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]

很抱歉,我僅給出部分答案,但這對於發表評論來說太長了。

錯誤function_clause表示,所有子句都不匹配給定的參數。

addFileChunk(A, [{part_body, Data}|Res], State) -> ...
addFileChunk(_A, [], State) when State#upload.last==true,State#upload.filename /=   undefined,State#upload.fd /= undefined -> ...
addFileChunk(_A, [], State) when State#upload.last==true -> ...
addFileChunk(_A, [], State) -> ...
addFileChunk(A, [{head, {_Name, Opts}}|Res], State ) -> ...
addFileChunk(A, [{body, Data}|Res], State) when State#upload.filename /= undefined -> ...

第一個參數未使用或與所有參數匹配,因此讓我們看一下其他兩個參數。

[{body,"Hello, World\n"}],
{upload,undefined,undefined,true}

如果upload記錄中有文件名,則可以匹配最后一個子句。 所以在uploadpost/1

case Action of    
"addf" ->
    State = case A#arg.state of
        undefined -> #upload{};
    _    -> A#arg.state
    end,

例如,您可以從arg.clidata提取文件名並將其添加到upload狀態。 這應該可以解決問題,但是我不知道為什么不使用SSL就可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM