summaryrefslogtreecommitdiff
path: root/tests/iobound_async_unix.py
blob: 8fb23e785596ac9ad56aa83da433ce1074677ddc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import socket
import errno
import struct


def send_request(env, client):

    client.setblocking(1)

    data = "hello world\r\n"

    # send uwsgi-echo header
    client.send(struct.pack('<BHB', 101, len(data), 0))

    # send body
    client.send(data)

    while 1:
        yield env['x-wsgiorg.fdevent.readable'](client.fileno(), 10)
        buf = client.recv(4096)
        if len(buf) == 0:
            break
        else:
            yield buf


def application(env, start_response):

    s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    s.setblocking(0)

    # env['x-wsgiorg.fdevent.readable'] = lambda fd,t: ""
    # env['x-wsgiorg.fdevent.writable'] = lambda fd,t: ""

    # yield ""

    c = s.connect_ex('echo.sock')
    if c == errno.EINPROGRESS:
        yield env['x-wsgiorg.fdevent.writable'](s.fileno(), 10)
        for r in send_request(env, s):
            yield r
    elif c == errno.EISCONN or c == 0:
        start_response('200 Ok', [('Content-Type', 'text/plain')])
        for r in send_request(env, s):
            yield r
    else:
        print c
        start_response('500 Internal Server Error', [('Content-Type', 'text/plain')])
        yield "Internal Server Error"

    s.close()