首页 > 解决方案 > mod-wsgi 在使用 https 和大数据包发布期间挂起

问题描述

我在win10中用 apache24++创建了一个https环境。openssl(1.1.1)mod-wsgi(4.5.24+ap24vc14)

它适用于 http 发布(无论发布数据包有多大),但我遇到了 https 发布的问题。

对于 https 发布:

  1. 当客户端和服务器是同一台本地机器时,无论发布数据包有多大,都可以正常工作。

  2. 当客户端是同一域的不同机器时,也适用于中小型发布数据包,可能小于3M,没有确切的数字。

  3. 当客户端是同域的不同机器,发布比较大的数据包,大概5M或6M左右,最初几次发布成功后,程序挂在服务器上body=environ['wsgi.input'].read(length),无响应,无错误(很少会经过很长时间才能成功,但大多数情况下它会挂起,直到连接超时)。

  4. 在调试客户端和服务器时,运行时的值length都正确且相同。

  5. 它似乎body=environ['wsgi.input'].read(length)来自sys.stdin.buffer.read(length),但我仍然找不到根本原因和解决方案。

客户端代码:

import json
import requests
import base64
import requests.packages.urllib3.util.ssl_
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ALL'
url="https://192.168.0.86"
# url="http://192.168.0.86"
f_img=open("./PICs/20191024142412.jpg",'rb')
# f_img=open("./PICs/20191023092645.jpg",'rb')
json_data={'type':'idpic','image':str(base64.b64encode(f_img.read()),'utf-8')}
result = requests.post(url,json=json_data,verify=False)
result_data=json.loads(result.content)
print(result_data)

部分服务器代码:

class WSGICopyBody(object):

    def __init__(self, application):
        self.application = application

    def __call__(self, environ, start_response):
        from io import StringIO, BytesIO
        length = environ.get('CONTENT_LENGTH', '0')
        length = 0 if length == '' else int(length)
        body = environ['wsgi.input'].read(length)
        environ['body_copy'] = body
        environ['wsgi.input'] = BytesIO(body)
        app_iter = self.application(environ,self._sr_callback(start_response))
        return app_iter

    def _sr_callback(self, start_response):
        def callback(status, headers, exc_info=None):
            start_response(status, headers, exc_info)
        return callback

app = Flask(__name__)
app.wsgi_app = WSGICopyBody(app.wsgi_app)

@app.route('/',methods=['POST'])
@app.route('/picserver',methods=['POST'])
def picserver():     
    print("before request.get_data")
    request_json_data = request.environ['body_copy']

标签: pythonapacheflaskhttpsmod-wsgi

解决方案


推荐阅读