0

I have a python script which succesfully posts a file to my localhost webserver running apache in <100ms. Now, I want to do exactly the same with Lua. I have come up with a script that posts that same image to my webserver but it takes a whopping ~24s to complete. The php running on the server receives and stores the file properly but for the Python script, the file comes in the $_FILES array whereas for the Lua script, I have to copy content from the php://input stream - also, looking at both POST requests with wireshark, I can see a 7667 POST from the Python script but not from the Lua, instead only a few TCP SYN & ACK frames. Any idea why my Lua script is missing the actual POST (incl. url) but it still seems to work (but really slow): Some code is below:

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!";
?>
4

1 回答 1

1

确保您的 Lua 脚本发送相同的 HTTP 标头。PHP 的重要部分是带有附件上传的表单作为“multipart/form-data”发送,并且该文件必须作为多部分 mime 消息正确嵌入到 HTTP 请求的 POST 正文中。

我看不到你的 Lua 脚本是否真的做到了这一点,但我认为没有。否则 PHP 会很高兴。

于 2013-08-08T21:31:44.213 回答