Python, BaseHTTPRequestHandler: как прочитать, что доступно в файле из сокета? - PullRequest
0 голосов
/ 11 декабря 2010

Я использую класс Python BaseHTTPRequestHandler для создания веб-сервера. Я хочу добавить конечную точку для WebSockets. Это означает, что мне нужно прочитать все, что доступно из rfile обработчика, чтобы я мог обрабатывать сообщения одно за другим по мере их получения (вместо того, чтобы читать входные данные while).

Я пытался использовать различные комбинации «чтения» (например, с большим буфером, думая, что он вернется раньше с меньшим количеством данных, если будет меньше данных; без параметров, но тогда это просто означает чтение до EOF) но не смог заставить это работать.

Я могу придумать два решения:

  • Для вызова read (1): читать байты один за другим. Я бы предпочел не делать этого, так как я не уверен, что такое семантика буферизации (например, я бы не хотел, чтобы syscall считывал за байт).

  • Чтобы временно сделать файл неблокирующим, затем попытайтесь выполнить чтение фрагмента данных, затем заблокируйте его, затем попытайтесь выполнить чтение на 1 байт. Это выглядит довольно грязно. Другой вариант, который я могу придумать, - это просто использовать неблокирующие сокеты, но это не очень хорошо работает с моей текущей многопоточной средой.

Любые идеи о том, как получить чтение, чтобы вернуть любые доступные данные?

1 Ответ

1 голос
/ 23 февраля 2013

WebSockets не являются HTTP, поэтому вы не можете обработать их с помощью обработчика HTTP-запросов.

Однако, используя BaseHTTPRequestHandler с HTTP, вы обычно читаете только тот объем данных, который ожидаете (например, как указано в заголовке Content-length.)

...