0

私は 100 ミリ秒未満で apache を実行しているローカルホスト Web サーバーにファイルを正常に投稿する python スクリプトを持っています。今、私は Lua でまったく同じことをしたいと思っています。同じ画像をウェブサーバーに投稿するスクリプトを思いつきましたが、完了するまでになんと 24 秒かかります。サーバー上で実行されているphpはファイルを適切に受信して保存します、Pythonスクリプトの場合、ファイルは$_FILES配列に入りますが、Luaスクリプトの場合、php://inputストリームからコンテンツをコピーする必要があります-また、wiresharkで両方のPOSTリクエストを見て、 Python スクリプトからは確認できます7667 POSTが、Lua からは確認できません。代わりに、少数の TCP SYN および ACK フレームのみです。Lua スクリプトに実際の POST (URL を含む) がないのに、まだ動作しているように見える (ただし、非常に遅い) 理由: いくつかのコードを以下に示します。

パイソン

#!/usr/bin/python


import urllib2
import time
from binascii import hexlify, unhexlify
import MultipartPostHandler


fname="test.gif"
host = "localhost"
#host = "semioslive.com"
URI="/test.php"
#URI="/api/gateway.php"
nodemac ="AABBCC"
timestamp = int(time.time())
func="post_img"

url = "http://{0}{1}?f={2}&nodemac={3}&time={4}".format(host, URI,func,nodemac,timestamp)
opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler)

data = {"data":open(fname,"rb")}

#r.get_method = lambda: 'PUT'
now = time.time()
response = opener.open(url, data, 120)
retval = response.read()

if "SUCCESS" in retval:
        print "SUCCESS"
else:
        print "RESPONSE sent at "+retval
        print "             Now "+str(time.time())


print "Request took "+str(time.time()-now)+"s to return"

ルア

#! /usr/bin/lua

http = require("socket.http")
ltn12 = require("ltn12")

local request_body = ltn12.source.file(io.open("test.gif"))

local response_body = {}


http.request{
    url = "`http://localohst/test.php`",  
    method = "POST",
    headers = {
        ["Content-Type"] =  "multipart/form-data",
        ["Content-Length"] = 7333
    },
    -- source = ltn12.source.file(io.open("test.gif")),
    source = request_body,
    sink = ltn12.sink.table(response_body)
}
print(response_body[1]) --response to request

PHP

<?
if (isset($_FILES['data']))
    move_uploaded_file($_FILES['data']['tmp_name'],"post(python).gif");
else
    copy("php://input","post(lua).gif");

echo "SUCCESS!";
?>
4

1 に答える 1