mod-wsgi зависает при публикации с https и большими пакетами данных - PullRequest
1 голос
/ 14 января 2020

Я создал среду https в win10 с apache24 + openssl(1.1.1) + mod-wsgi(4.5.24+ap24vc14).

Это хорошо работает для отправки по http (независимо от размера пакета данных для публикации), но я встретил проблема при отправке https.

при отправке https:

  1. , когда клиент и сервер - это один и тот же локальный компьютер, также хорошо работает независимо от того, насколько велики данные публикации. пакет.

  2. , когда клиент находится на другом компьютере в том же домене, он также хорошо работает для небольших или средних пакетов данных для публикации, возможно, менее 3 М, точного числа нет.

  3. , когда клиент находится на другом компьютере в том же домене и отправляет относительно большие пакеты данных, около 5 или 6 миллионов, после нескольких первых успешных публикаций программа зависает на сервере body=environ['wsgi.input'].read(length), нет ответа и нет ошибка (редко она пройдет успешно через долгое время, но в основном она будет зависать до истечения времени ожидания соединения).

  4. при отладке клиента и сервера значения времени выполнения length являются правильными и одинаковыми.

  5. кажется body=environ['wsgi.input'].read(length) исходит из sys.stdin.buffer.read(length), но я все еще не могу найти причину и решение root.

Код клиента:

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']
...