0

我有一个使用 gevent.pywsgi.WSGIServer (http://www.gevent.org/gevent.pywsgi.html)的 Web 服务器,我需要处理非 http 请求以及正常的 http 请求。

Server:
    web_server = gevent.pywsgi.WSGIServer(('', 8080), web_server);
    web_server.serve_forever();

Handler:
def viewer_command_server(env, start_response):
    if env['REQUEST_METHOD'].upper() == "PUT":
        path = env["PATH_INFO"]
        start_response("200 OK", [("Content-Type", "text/html"), ("Cache-Control", "no-cache"), ("Connection","keep-alive")])
            return [ ""]  

这处理正常的 PUT 请求,但我还想为 flash 应用程序使用的 crossdomain.xml 文件提供服务。但问题是当 Flash 应用程序尝试检索其 crossdomain.xml 文件时,我得到了这个。

"socket fileno=13 sock=66.228.55.170:9090 peer=96.54.202.251:63380: Invalid HTTP method: '<policy-file-request/>\x00'
96.54.202.251 - - [2012-05-21 22:58:53] "<policy-file-request/>" 400 0 2.940527
"

有没有办法处理这个请求?Adobe 建议在端口 843 上运行单独的 tcp 服务器来提供此文件。我想把所有东西都保留在 8080 端口上。

4

2 回答 2

0

在端口 843 上使用的协议不是 HTTP。请参阅http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html

一个有效的 HTTP 请求看起来像

GET /path HTTP/1.0

(有关更多示例,请参见例如http://www.jmarshall.com/easy/http/#sample。)

如果有办法告诉 Flash Player 客户端在 843 以外的某个端口上查找策略文件,那么也许有办法告诉它使用 HTTP 而不是这个自定义的 XML-ish "" 消息,然后只有这样你能从你的HTTP服务器处理这个吗?

一切皆有可能,但我认为在用于 HTTP 的同一端口 8080 上处理非 HTTP 请求作为 WSGI 服务器的一部分听起来根本不是一个好主意。

于 2012-05-22T03:34:35.190 回答
0

我今天设法把这个剥得更远一点。埋在 adobe 文档中的是一个注释,如果您使用的是原始套接字,那么 fit 将使用他们的原始 XML 查询来查找您的跨域文件。如果您指定“http”,它似乎确实可以工作,并且它确实可以通过 http 获取跨域文件。对我来说,问题是我在我的 Flash 脚本中使用了原始 tcp 套接字。所以它开始尝试从该服务器获取跨域文件。因此,为了简单起见,我将更改网络调用以使用 http。无论如何,这就是他们正在做的事情(我使用的是我发现的使用 http 多部分响应进行流式传输的示例)

于 2012-06-17T03:40:05.727 回答