2016-04-27 2 views
0

Я пытаюсь подключиться к своему тестовому приложению fcgi через unix-сокет. Сервер довольно прост и взят из документации на колбу. http://flask.pocoo.org/docs/0.10/deploying/fastcgi/соединение с флепом и розеткой

Клиентский код принадлежит мне. Я ожидаю отправить образец HTTP-запроса через socket.send и получить ответ HTTP с «Hello World». Проблема в том, что клиент зависает на s.recv(1024), и ничего не происходит.

Серверный код:

def myapp(environ, start_response): 
    start_response('200 OK', [('Content-Type', 'text/plain')]) 
    return ['Hello World!\n'] 

if __name__ == '__main__': 
    from flup.server.fcgi import WSGIServer 
    WSGIServer(myapp, bindAddress="fcgi.sock").run() 

Клиент код:

# -*- coding: utf-8 -*- 
import socket 

req = """GET/HTTP/1.1 
Host: localhost\r\n\r\n""" 

s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 
s.settimeout(1.0) 

s.connect("fcgi.sock") 
s.send(req) 

data = s.recv(1024) 
s.close() 

print('Received ' + repr(data)) 

Я проверил, чтобы получить ответ через Nginx, и она работала хорошо, но я не могу выполнить это с помощью сокетов. Кто-нибудь знает, в чем проблема с моим клиентским кодом?

ответ

1

Если кому-то интересно, я выяснил, в чем проблема.

Было наивно полагать, что сервер FCGI получит необработанную строку запроса HTTP и отреагирует на нее правильно. Сервер FCGI не предназначен для обработки HTTP, он предназначен для запросов FCGI, которые имеют другой формат: http://www.mit.edu/~yandros/doc/specs/fcgi-spec.html

Вот почему она висит на recv - сервер просто не может ответ на такой тип запросов.

В пакете python flup есть клиент fcgi. Если вы когда-либо хотели протестировать приложение fcgi, вы можете его использовать.

Смежные вопросы