:- initialization(go).


count_atom(_) :-
	g_assign(c, 0),
	current_atom(_),
	g_inc(c),
	fail.

count_atom(X) :-
	g_read(c, X).



go:-
    socket('AF_INET',Sock),
    socket_bind(Sock,'AF_INET'(localhost,7000)),
    socket_listen(Sock,10),
    main_loop(Sock).
    
main_loop(Sock) :-
    repeat, 
    socket_accept(Sock,Sin,Sout),
    stream_property(Sin, file_name(Fin)),
    stream_property(Sout, file_name(Fout)),
    count_atom(At),
    format('sock=~d ~w=~a  ~w=~a  atoms=~d~n', [Sock, Sin, Fin, Sout, Fout, At]),
    set_stream_type(Sout,binary),
    try_comunications(Sin,Sout),
    close(Sin),
    close(Sout),
    fail.

try_comunications(_Sin,Sout):- 
   %%%%%% ...... Skipped reading and analizing request ......
   send_text(Sout,"OK").

%% ------------------------------------------------------ %% 

send_text(Sout,Message):-
  send_message(Sout,"200 OK","Text/Html",Message).

send_message(Sout,Rcode,Contype,Message):-
   send_message_header(Sout,Rcode,Contype,Message,"").

send_message_header(Sout,Rcode,Contype,Message,Header):-
   put_bytes(Sout,"HTTP/1.0 "), put_bytes(Sout,Rcode),
put_bytes(Sout,"\r\n"),
   put_bytes(Sout,"Content-Type: "), put_bytes(Sout,Contype),
put_bytes(Sout,"\r\n"),
   put_bytes(Sout,Header),
   code_len(Message,Size),
   put_bytes(Sout,"Content-Length: "), put_bytes(Sout,Size),
   put_bytes(Sout,"\r\n\r\n"),
   put_bytes(Sout,Message).

code_len(Message,Len):-    
        length(Message,Size),number_codes(Size,Len).

put_bytes(_Sout,[]).
put_bytes(Sout,[C|R]):-  put_byte(Sout,C), put_bytes(Sout,R).

