// Przykladowy kod do wykorzystania w serwerze WWW

int main(int argc, char *argv[])
{
	int 	sock, fd;
	FILE	*fpin;              // czytanie z gniazda
	char	request[BUFSIZ];
    ...

	fd = accept( sock, NULL, NULL );
 	
        fpin = fdopen(fd, "r" );
		/* czytaj żądanie HTTP */
		fgets(request,BUFSIZ,fpin);
		printf("otrzymalem żądanie: = %s", request);
		/* pomiń ewentualne argumenty */
        read_til_crnl(fpin);
		/* wykonaj żądanie klienta */
		process_rq(request, fd);
    	fclose(fpin);
   ... 	
	
}

// pomiń ewentalne argumenty
void read_til_crnl(FILE *fp)
{
	char	buf[BUFSIZ];
	while( fgets(buf,BUFSIZ,fp) != NULL && strcmp(buf,"\r\n") != 0 )
		;
}

// przetwarzaj żądanie
void process_rq( char *rq, int fd )
{
	char	cmd[BUFSIZ], arg[BUFSIZ];
    ...

	strcpy(arg, "./");		/* poprzedz argument sciezka */
	// czy wystarczajaca liczba slow w wierszu
    if ( sscanf(rq, "%s%s", cmd, arg+2) != 2 ) 
		return;

    // tylko GET
	if ( strcmp(cmd,"GET") != 0 )
		cannot_do(fd);              // Polecenia jeszcze nie zaimplementowano
	// czy katalog/plik istnieje 
    else if ( not_exist( arg ) )
		do_404(arg, fd );           // Pliku/katalogu nie znaleziono
	// jesli to katalog
    else if ( isadir( arg ) )
		do_ls( arg, fd );           // Przeslij zawartość katalogu
	else // w preciwnym wypadku to plik
		do_cat( arg, fd );          // przeslij zawartosc pliku
}

// żądanie poprawne - przeslana zawartosc okreslonego typu
void header( FILE *fp, char *content_type )
{
	fprintf(fp, "HTTP/1.0 200 OK\r\n");
	if ( content_type )
		fprintf(fp, "Content-type: %s\r\n", content_type );
}

// żądanie niepoprawne
void cannot_do(int fd)
{
	FILE	*fp = fdopen(fd,"w");

	fprintf(fp, "HTTP/1.0 501 Not Implemented\r\n");
	fprintf(fp, "Content-type: text/plain\r\n");
	fprintf(fp, "\r\n");

	fprintf(fp, "Polecenia jeszcze nie zaimplementowano\r\n");
	fclose(fp);
}

// przykladowa realizacja przeslania zawartosci katalogu
void do_ls(char *dir, int fd)
{
	FILE	*fp ;

	fp = fdopen(fd,"w");
	header(fp, "text/plain");
	fprintf(fp,"\r\n");
	fflush(fp);
	// ls ma przesylac do gniazda 
    ...
	execlp("ls","ls","-l",dir,NULL);
	perror(dir);
	exit(1);
}

// przykladowa realizacja przesylania pliku
void do_cat(char *f, int fd)
{
//	char	*extension = file_type(f); // potrzebna funkcja zwracajaca rozszerzenie
	char	*content = "text/plain";
	FILE	*fpsock, *fpfile;
	int	c;

/* Jesli chcesz przesylac pliki roznych typow, napisz funkcję file_type
   i odkomentuj ponizszy fragment 
	if ( strcmp(extension,"html") == 0 )
		content = "text/html";
	else if ( strcmp(extension, "gif") == 0 )
		content = "image/gif";
	else if ( strcmp(extension, "jpg") == 0 )
		content = "image/jpeg";
	else if ( strcmp(extension, "jpeg") == 0 )
		content = "image/jpeg";
*/
	fpsock = fdopen(fd, "w");
	fpfile = fopen( f , "r");
	if ( fpsock != NULL && fpfile != NULL )
	{
		header( fpsock, content );
		fprintf(fpsock, "\r\n");
		while( (c = getc(fpfile) ) != EOF )
			putc(c, fpsock);
		fclose(fpfile);
		fclose(fpsock);
	}
        ...
}


