2012-05-22 41 views
0

我有一个使用gevent.pywsgi.WSGIServer (http://www.gevent.org/gevent.pywsgi.html)的web服务器,我需要处理一个非http请求以及正常的http请求。如何处理pywsgi中的非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请求,但我也想通过服务器闪存应用程序使用的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 
" 

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

回答

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服务器的一部分处理。

+0

谢谢,问题是,Flash使用它自己的'xmlish'查询_and_,如果它不能得到一个答案在端口843,然后它回落到http端口。 有些时候,由于某些原因它无法连接到843,并且它在应用程序中不可见。所以http服务器仍然会收到请求。如果我们能够陷害并处理这种情况,那将会更顺利。 –

+0

我不确定所有Flash播放器的功能,但这听起来不像一个合理的行为 - 它总是发送非HTTP请求到它知道的http服务器,当它不能联系端口843.(这很常见,很多公司都防火墙,然后代理端口80和443)。你确定这里没有更多的东西吗? – metamatt

+0

重新“陷阱并处理”这种情况 - 你可能会严重破坏你的wsgi服务器,但这样做会很难看。 – metamatt

0

今天我设法将这一块剥掉了一点。如果您使用的是原始套接字,那么fit会使用其原始XML查询来查找跨域文件。如果你指定'http',它确实会起作用,并且它通过http获取跨域文件。对我来说问题是我在我的Flash脚本中使用了原始的tcp套接字。所以它试图从该服务器获取跨域文件。 所以为了保持简单,我会将网络调用改为使用http。这是他们正在做什么(我正在使用一个样本,我发现,使用HTTP multipart响应流)