#!/usr/bin/env python
import socket
import sys
import os
import signal
import re



# Vytvorime TCP socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# Po ukonceni zostane niekedy socket v stave FIN_WAIT_2
# REUSEADDR umozni opatovny bind.
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
# Naviazeme ho na port 2222 pre vsetky lokalne adresy
s.bind(('',2222))
# Najviac 5 spojeni bude cakat vo fronte
s.listen(5)

# Toto je kvoli tomu, aby nam nezostavali zombie 
# procesy a neprerusoval nas signal SIGCHLD
signal.signal(signal.SIGCHLD,signal.SIG_IGN)

try:
    while True:
        connected_socket,address=s.accept()
        print 'Connected by',address
        # Po pripojeni klienta sa forkneme.
        # Child proces obsluzi klienta a zavola sys.exit()
        # Parent proces ocakava
        # dalsieho klienta.
        pid_chld=os.fork()
        if pid_chld<0:
            print "fork vratil chybu"
            sys.exit(1)
        if pid_chld==0:
            # Toto robi child proces.
            # Vytvorime si file object z pripojeneho
            # socketu
            f=connected_socket.makefile()
            line=f.readline()
            m=re.match('^GET *([^ ]*).*$',line)
            response='Client said:\n'+line
            for line in f:
                response+=line
                # CR LF ukoncuje request
                if line=='\r\n':
                    break
            f.write('HTTP/1.1 200 OK')
            f.write('Content-type: text/plain\r\n')
            f.write('Content-length: %d\r\n' % len(response))
            f.write('\r\n')
            f.write(response)
            # f je duplikovany connected_socket, preto
            # ho musime zavriet osobitne.
            f.close()
            # Takymto sposobom sa spravne zatvara
            # socket, v prikladoch v dokumentacii to
            # je zle.
            connected_socket.shutdown(socket.SHUT_RDWR)
            connected_socket.close()
            print address,'disconnected'
            sys.exit(0)
except KeyboardInterrupt:
    pass
s.close()

