#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

# cc proxy
# Teil der Informatik-Diplomarbeit von Hans-Georg Eßer
# http://privat.hgesser.com/docs/Info-Diplom/
# (c) 2004, 2005 Hans-Georg Eßer
#
# proxy/ccproxy.py


### Netzwerkversion
### prueft, dass wirklich 4096 Bytes empfangen wurden, und schreibt erst
### dann die Zeit

# Globale Variablen

LOGFILE="/home/esser/Daten/Studium/Info2004/python/proxy/myproxy/myproxy.log"


# Init
from socket import *
from time import sleep,time,ctime
from string import split
from sys import stdout

# serve(): Routine, die mit einem Client spricht.
def serve(c,addr):
    client_ip=addr[0]
    print "** Connect from:", client_ip
    msg=c.recv(2048)
    lines = split(msg,'\n')
    for i in range(len(lines)):
        lines[i] = lines[i][:-1]
    getcmd = lines[0]
    print "** GET:", getcmd
    getcmdparts = split(getcmd)     # GET-Zeile filtern
    url=getcmdparts[1]              # URL aus "GET http://... HTTP/1.x"
    [null1,null2,serverport,rest]=split(url,"/",3)  # (genau 3 Teile)
    if ":" in serverport:
        [server,port]=split(serverport,":")
        port=int(port)
    else:
        server=serverport; port=80

    # Web-Seite holen und Timing ueberwachen
    s_web = socket(AF_INET, SOCK_STREAM)
    s_web.connect((server,port))
    for l in lines[:-2]:     # alle Zeilen ausser den letzten 2
        s_web.send(l+"\n")
        print "** Sending", l
    s_web.send("\n")
    print "** Sending <CR>"

    # Blockweise holen und zustellen
    done=0
    psize=4096                  # Packet size for http get: 4 KByte
    times=[]                    # Hier die Wartezeiten speichern
    addedtime = 0.0             # Evtl. mehrere recv()-Aufrufe
    recvsize = 0                # Auf 4096 hochzaehlen

    while not done:
        t0=time()
        result=s_web.recv(psize-recvsize)
        t1=time()
        recvsize += len(result)
        addedtime += (t1-t0)
        if recvsize >= psize:
            times.append(addedtime)   # Verzoegerung speichern
            recvsize -= psize
            addedtime = 0.0
        c.send(result)
        print len(result),
        if result=="": 
            done=1
    s_web.close()
    print

    secret=""
    timestring=""
    for t in times:
        timestring = timestring + ( "%1.5f" % t ) + " "
        if t > 0.01:
            secret+="1"
        else:
            secret+="0"
    logtime = ctime()
    log.write ( logtime+": "+timestring[:-1]+'\n' )
    log.write ( logtime+": "+secret+'\n' )


# main()
s = socket(AF_INET, SOCK_STREAM)   # TCP Socket erzeugen
s.bind(("",21000))                 # An Port 21000 binden
s.listen(1)                        # Eine Verbindung zulassen

while 1:
    client,addr = s.accept()       # Verbindung annehmen
    log = open(LOGFILE,"a")        # Logfile öffnen, Append-Mode
    serve(client,addr)             # Mit Client arbeiten
    log.close()                    # Logfile schließen
    client.close()                 # Verbindung beenden

