#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <strings.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <fcntl.h>

#define SERVER_PORT 8080 /* Serverport */
#define TRUE 1

add_header(char *ret)
{
	strcat(ret, "Server: TecO_MinimalServer(Praktikum99/Gruppe4)\n"); 
 	strcat(ret, "Content Type: text/html\n\n"); 
}

main()
{
	int sd, nsd; 		     /* Deskriptoren fuer Sockets */
	struct sockaddr_in server;   /* Adresse in fuer Socketstruktur */
	char buf[1024], ret[1024];   /* Puffer fuer Anfrage und Antwort */

	char *method, *filename;
	char *cursor;
	int read_bytes,fd;
	int server_port=SERVER_PORT;

	sd = socket(AF_INET, SOCK_STREAM, 0);  /* Socket anlegen */
        /* Adresse in Struktur eintragen */
	server.sin_family = AF_INET;                 /* Internet */
	server.sin_addr.s_addr = htonl(INADDR_ANY);  /* alle Adressen */
	server.sin_port = htons(server_port);        /* Serverport */
        /* Socket an die Adresse binden */
	while(bind(sd, (struct sockaddr *) & server, sizeof(server))!=0)
	{
	  printf("Port %d is already bound, trying next\n",server_port);
	  server.sin_port = htons(++server_port);        /* Serverport */
	}
	listen(sd, 5);      /* auf Anfragen hoeren */
 	printf("Wait for Requests on port %i\n", server_port); 
	while (TRUE) {      /* Endlosschleife */
          /* Falls Anfrage ankommt diese akzeptieren */
	  nsd = accept(sd, (struct sockaddr *) 0, (int *) 0);
	  bzero(buf, sizeof(buf));   /* Puffer leeren */
	  read(nsd,buf,sizeof(buf)); /* Anfrage lesen */


	  /* Filename isolieren, pointer sind suuuper */ 
	  /* keine Sicherheit fuer Daten, jeder darf alles lesen! */
	  filename=&buf[5];

	  cursor=filename;
	  while(!isspace(*cursor))
	  {
	    cursor++;
	  }
	  *cursor='\0';

	  /* Gegebenenfalls index.html lesen */
	  if ((strlen(filename)==0)||(cursor[-1]=='/'))
 	    strcat(filename,"index.html");

	  /* Filename behandeln */

	  printf("asks for file %s\n", filename);
	  fd=open(filename,O_RDONLY,0);

          if(fd==-1)
	  {
 	    sprintf(ret, "HTTP/1.0 503 ERROR\n"); 
	    add_header(ret);
 	    strcat(ret, "<h1>File \n"); 
 	    strcat(ret, filename); 
 	    strcat(ret, " not Found</h1>\n"); 

	    write(nsd, ret, strlen(ret));   /* Antwort zuruecksenden */
	  }
	  else
	  {
 	    sprintf(ret, "HTTP/1.0 200 OK\n"); 
	    add_header(ret);
	    write(nsd, ret, strlen(ret));   /* Header zuruecksenden */

	    while((read_bytes=read(fd,ret,sizeof(ret)))!=0)
	    {
	      write(nsd, ret, read_bytes);   /* Puffer schreiben */
	    }
	  }

	  close(nsd); /* Anfrageverbindung schliessen */
 	  printf(" - Requests handled!\n"); 
	}
}

