我正在尝试使用ajax编写应用程序,将Nginx作为前端,将相关请求代理到我编写的一个小应用程序。它所做的就是epoll一些套接字并使用文件描述符。以下是一些代码段:
Nginx配置:
upstream cometutils {
server unix:/tmp/cutil_socket;
}
...
location /test {
proxy_buffering off;
proxy_read_timeout 120;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://cometutils;
}
JS代码:
var kdata="foo=bar";
$.ajax({
async:true,
url:"http://127.0.0.1/test",
data:kdata,
type:"GET",
dataType:"text",
cache:"false",
success:function(retval)
{
alert(retval);
}
});
相关的C ++代码,让您了解它的作用:
//fd is the file descriptor.
string resp="HTTP/1.1 200 OK\n\nContent-Type: text/plain\n\nHi there\n";
send(fd,resp.c_str(),resp.length(),0);
resp="sadsadasd\n";
sleep(2);
send(fd,resp.c_str(),resp.length(),0);
close(fd);
我100%确定该程序没有任何问题,它几乎可以与任何使用套接字通信的东西完美配合,包括......
...常规页面请求;例如,键入http://127.0.0.1/test?blabla=...
将使浏览器首先显示"Hi there!"
文本,然后在两秒钟后显示第二条消息并终止连接。
但是,ajax请求根本没有收到任何内容(响应主体只是空的)。
它应该在收到第一条消息后立即终止(alert()
函数被调用),服务器端send()
表示它已经发送了它应该发送的所有字节,但是第二条{{ 1}}返回-1。
我也尝试使用beforeSend属性和普通xmlhttprequest对象来直接处理onreadystatechange回调,但它们根本没有帮助(readyState永远不会变为3,响应立即终止)。
对于原因可能有任何想法表示赞赏。