Python脚本向Lua重复发送HTTP POST请求。

我有一个 Python 脚本,可以在 <100ms 内成功将文件发布到运行 Apache 的本地主机。现在,我想用 Lua 做完全相同的事情。我已经编写了一个脚本,将相同的图片发布到我的 Web 服务器,但是它需要长达约 24 秒的时间才能完成。运行在服务器上的 PHP 正确地接收和存储文件,但对于 Python 脚本,文件出现在 $_FILES 数组中,而对于 Lua 脚本,我必须从 php://input 流中复制内容 - 此外,使用 Wireshark 查看两个 POST 请求时,我可以看到来自 Python 脚本的 7667 POST,但没有来自 Lua 脚本,而是只有一些 TCP SYN 和 ACK 帧。有什么想法为什么我的 Lua 脚本缺少实际的 POST(包括 URL),但它仍然似乎可以工作(但非常缓慢):

以下是一些代码:

Python

#!/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"

Lua

#! /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!";
?>
点赞
用户1627406
用户1627406

请确保你的 Lua 脚本发送相同的 HTTP 头。对于 PHP 来说,重要的部分是附带文件上传的表单必须以“multipart/form-data”形式发送,并且文件必须作为多部分 MIME 消息正确嵌入到 HTTP 请求的 POST 主体中。

我无法确定你的 Lua 脚本是否实际执行了这个步骤,但我认为没有。否则,PHP 会很高兴的。

2013-08-08 21:31:44