在Yaws网络服务器上上传进度

掉落

我正在Yaws 2.0上测试脚本upload2.yaws,但无法正常工作。该脚本是为Yaws 1.57开发的。

Yaws的日志是:

POST /html/upload2.yaws HTTP/1.1
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Host: 192.168.26.10
Referer: http://192.168.26.10/html/upload2.yaws
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
Cookie: gsScrollPos=0; gsScrollPos=0
Content-Length: 1587
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary5zKIyUtdiK82R4de
Accept-Language: pt,en-US;q=0.8,en;q=0.6,pt-BR;q=0.4
Accept-Encoding: gzip, deflate
Https: 1
Origin: http://192.168.26.10
Cache-Control: max-age=0


upload.yaws:multipart/3 State=filename=undefined rlist=undefined data=undefined
upload.yaws:multipart/3 result
upload.yaws:process_part/4d State=filename=undefined rlist=undefined data=undefined
upload.yaws:multipart/3 done
upload.yaws:result_ehtml/3 error Reason=Error: filename not found in header.
Worker: <0.78.0> 
[2015-07-24 13:50:54.795] ===== SRV -> CLI =====
HTTP/1.1 200 OK
Server: Yaws 2.0
Date: Fri, 24 Jul 2015 13:50:54 GMT
Content-Length: 532
Content-Type: text/html

当我将表单操作更改为使用netcat的侦听端口时,会收到带有文件名的完整标头:

代码:

show_form(A, Feedback) -> {ehtml,
        [       {form
                ,[{enctype,"multipart/form-data"},{action,"http://192.168.26.10:8800"},{method,"post"}]
                ,       [{p,[],"Choose a file and click Upload."}
                        ,{p,[],{input,[{type,"file"},{name,"file"}],[]}}
                        ,{p,[],{input,[{type,"submit"},{value,"Upload"}],[]}}
                        ]
                }
        ,{p,[],Feedback}
        ]}.

我开始了数控

$ sudo nc -l 8800

然后显示以下标题:

POST / HTTP/1.1
Host: 192.168.26.10:8800
Connection: keep-alive
Content-Length: 1587
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://192.168.26.10
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
HTTPS: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary9iHQOXBtRE9CyRAZ
Referer: http://192.168.26.10/html/upload2.yaws
Accept-Encoding: gzip, deflate
Accept-Language: pt,en-US;q=0.8,en;q=0.6,pt-BR;q=0.4
Cookie: gsScrollPos=0

------WebKitFormBoundary9iHQOXBtRE9CyRAZ
Content-Disposition: form-data; name="file"; filename="signing_debian_packages.txt"
Content-Type: text/plain

我怀疑该错误是在multipart函数上,但是我在Erlang中是菜鸟:/


    %%% Process part of a multi-part form post
    %%% returns Ehtml | {get_more, Continuation, NewState}
    multipart(A, State) when is_record(State,upload) ->
            io:fwrite("upload.yaws:multipart/3 State=~s~n", [upload_to_string(State)]),
            case yaws_api:parse_multipart_post(A) of
            {cont, Cont, Part} ->
                    io:fwrite("upload.yaws:multipart/3 cont~n"),
                    case process_part(A, Part, State) of
                    {done, Result} ->
                            io:fwrite("upload.yaws:multipart/3 done~n"),
                            result_ehtml(A, Result);
                    {cont, NewState} ->
                            io:fwrite("upload.yaws:multipart/3 get_more NewState=~s~n", [upload_to_string(NewState)]),
                            {get_more, Cont, NewState}
                    end;
            {result, Part} ->
                    io:fwrite("upload.yaws:multipart/3 result~n"),
                    case process_part(A, Part, State#upload{last=true}) of
                    {done, Result} ->
                            io:fwrite("upload.yaws:multipart/3 done~n"),
                            result_ehtml(A, Result);
                    {cont, _} ->
                            io:fwrite("upload.yaws:multipart/3 error~n"),
                            result_ehtml(A, {error, "Error During Upload"})
                    end;
            [] -> result_ehtml(A, {error,"You must select a file to upload."})
            end.

有人有主意吗?

史蒂夫·维诺斯基

问题出在process_part处理标头function子句中:

%%% Process header
process_part(A, [{head, {"file", Opts}}|Tail], State ) ->
        io:fwrite("upload.yaws:process_part/4d State=~s~n", [upload_to_string(State)]),
        case lists:keysearch(filename, 1, Opts) of
        {value, {_, UncheckedFileName}} ->
                io:fwrite("upload.yaws:process_part/4d UncheckedFileName=~s~n", [UncheckedFileName]),
                FileName = sanitize_filename(UncheckedFileName),
                io:fwrite("upload.yaws:process_part/4d FileName=~s~n", [FileName]),
                process_part(A, Tail, State#upload{filename=FileName,rlist=[]});
        false ->
                {done, {error, "Error: filename not found in header."}}
        end;

调用的第一个参数lists:keysearch/3是atom filename,但应"filename"改为字符串修改后的功能是:

%%% Process header
process_part(A, [{head, {"file", Opts}}|Tail], State ) ->
        io:fwrite("upload.yaws:process_part/4d State=~s~n", [upload_to_string(State)]),
        case lists:keysearch("filename", 1, Opts) of
        {value, {_, UncheckedFileName}} ->
                io:fwrite("upload.yaws:process_part/4d UncheckedFileName=~s~n", [UncheckedFileName]),
                FileName = sanitize_filename(UncheckedFileName),
                io:fwrite("upload.yaws:process_part/4d FileName=~s~n", [FileName]),
                process_part(A, Tail, State#upload{filename=FileName,rlist=[]});
        false ->
                {done, {error, "Error: filename not found in header."}}
        end;

进行此更改后,upload2.yawsYaws 2.0和Erlang 18.0可以很好地工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用于在Android上上传文件的网络服务器

来自分类Dev

如何在网络服务器上存储和组织上传的图像?

来自分类Dev

网络服务器上的Memcached

来自分类Dev

元素在网络服务器上消失

来自分类Dev

双向网络服务器

来自分类Dev

使用xcode和php将图像上传到网络服务器

来自分类Dev

创建到网络服务器后,是否可以自动上传文件?

来自分类Dev

使用xcode和php将图像上传到网络服务器

来自分类Dev

将文件作为 JSON 上传到 Python 网络服务器

来自分类Dev

网络服务器的out.flush()问题

来自分类Dev

与网络服务器相关的autoIndex是什么?

来自分类Dev

设置安全的网络服务器

来自分类Dev

设置动态网络服务器

来自分类Dev

保持我的生产网络服务器更新

来自分类Dev

将android应用与网络服务器连接

来自分类Dev

简单的网络服务器无法正常工作

来自分类Dev

网络服务器显示错误的布局

来自分类Dev

网站/网络服务器容错-最佳做法

来自分类Dev

oAuth2 的 Java 网络服务器

来自分类Dev

网络服务器 php 和 mysql 滞后

来自分类Dev

自动启动网络服务器和程序

来自分类Dev

Apache 网络服务器如何检测 CNAME

来自分类Dev

使用ajax从网络服务器获取响应

来自分类Dev

安排python脚本在网络服务器上运行

来自分类Dev

如何在网络服务器上安装最近创建的灵巧产品?

来自分类Dev

实时网络服务器上的404 Code Igniter

来自分类Dev

我的网络服务器上的CURLOPT_SSLVERSION

来自分类Dev

如何在我的网络服务器上运行python脚本?

来自分类Dev

如何使我在Android上运行的网络服务器公开可用