2014-08-29 51 views
0

我需要帮助。我有一个工作网站。上线前的最后一步是更新SSL证书。这并没有发生,因为该版本的erlang中存在一个错误。我升级了erlang,然后erlang和yaws驱动程序之间的代码级别不匹配。我没有加载并遵守雅各布的规定,我非常高兴能够更新SSL证书。在开始推出后,用户指出上传功能无法正常工作。我证实它仍然适用于不接受ssl证书的版本。我认为问题出在构建过程中,所以我开始使用新的虚拟机CentOS 7以及该发行版中的erlang和Yaws。同样的问题。看来我可以上传或新的证书,但不能同时拥有。我的上传版本是std upload.yaws的稍微修改版本。但是,我选择了它并尝试了它。它也失败了。以下是软件级别,失败代码和崩溃数据。upload.yaws失败,erlang R16B-03.7.el7和yaws 1.98-2.el7

任何帮助将不胜感激。

________Code _____________________________________________________________________ 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

_CODE____________________________________________________________________________________________________________________________

-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.` 

_________Crash data_________________ 内部错误,雅司病码坠毁

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; [email protected]"], 
       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}]}] 
+1

您显示的代码似乎缺少模块声明等,这意味着错误报告中的行号是无用的。我可以建议你通过https://lists.sourceforge.net/lists/listinfo/erlyaws-list将你的问题通过电子邮件发送到Yaws邮件列表,并且包含你的代码的全部要点或者pastebins的链接? – 2014-08-29 22:28:31

回答

0

我只有部分答案很抱歉,但这是一个评论太长。

错误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的工作。

+0

谢谢,tkowal。你指出了我正确的方向。由于此代码在升级之前已经运行,因此它没有恢复文件名,这必须是由于Yaws或Erlang发生了更改。我开始使用Yaws并浏览所有发行说明。在版本1.94上,向upload.yaws引入了向后不兼容的修复程序。奇怪的是,没有人更新示例文件。现在搜索查找字段“文件名”而不是原子'文件名'。标记为固定.... – 2014-08-31 01:29:28