Ejemplo n.º 1
0
/* envoiRep()
 * Arguments: le nom du repertoire, la socket
 * valeur renvoyee: true si OK, false si erreur
 */
bool envoiRep(char *rep, int soc) {
  DIR *dp;
  struct dirent *pdi;
  char buf[1024], nom[1024];

  dp = opendir(rep);
  if (dp == NULL)
    return false;

  write(soc, OK200, strlen(OK200));
  sprintf(buf, "<html><title>Repertoire %s</title><body>", rep);
  write(soc, buf, strlen(buf));

  sprintf(nom, "<ul>");
  while ((pdi = readdir(dp)) != NULL) {
    /* A completer
     * Le nom de chaque element contenu dans le repertoire est retrouvable a
     * l'adresse pdi->d_name. Faites man readdir pour vous en convaincre.
     * Dans un premier temps, on se contentera de la liste simple.
     * Dans une petite amelioration on poura prefixer chaque element avec
     * l'icone folder ou generic en fonction du type du fichier.
     * (Tester le nom de l'element avec le chemin complet.) */
	if(typeFichier(pdi->d_name) == NORMAL)	{
		sprintf(nom, "<li> <img src=\"/icons/generic.gif\"> %s</li>", pdi->d_name);
		write(soc, nom, strlen(nom));
	}
	else if(typeFichier(pdi->d_name) == REPERTOIRE) {
		sprintf(nom, "<li> <img src=\"/icons/folder.gif\"> %s</li>", pdi->d_name);
		write(soc, nom, strlen(nom));
	}
	else{
		sprintf(nom, "<li> error </li>");
		write(soc, nom, strlen(nom));
	}
  }
  sprintf(nom, "</ul></body></html>");

  write(soc, nom, strlen(nom));
  write(soc, "\n\r", 2);
  return true;
}
Ejemplo n.º 2
0
void communication(int soc, struct sockaddr *from, socklen_t fromlen) {
  int s;
  char buf[BUFSIZE];
  ssize_t nread;
  char host[NI_MAXHOST];
  bool result;
  char *pf;
  enum op { GET, PUT } operation;

  /* Eventuellement, inserer ici le code pour la reconnaissance de la
   * machine appelante */
  s = getnameinfo(from,fromlen,host,NI_MAXHOST,NULL,0,NI_NUMERICHOST);
  if(s!=0){
    perror("cant not getnameinfo\n");
    exit(EXIT_FAILURE);
  }
    printf("a client connect -host:%s!!\n",host);
  /* Reconnaissance de la requete */
  nread = read(soc, buf, BUFSIZE);
    printf("recu:%s\n",buf);
  if (nread > 0) {
    if (strncmp(buf, "GET", 3) == 0)
      operation = GET;
  } else {
    perror("Erreur lecture socket");
    return;
  }

  switch (operation) {
    case GET:
      pf = strtok(buf + 4, " ");
      /* ===little example for strtok()====
      printf("=========\n");
      while(pf){
        printf("%s\n",pf);
        pf = strtok(NULL," ");
      }
        exit(EXIT_SUCCESS);
      */
      /* redireciton????
      if(strcmp(pf,"/")==0){
         envoiRep(".",soc);
      }
      */


      /* On pointe alors sur le / de "GET /xxx HTTP...
       * strtok() rend l'adresse du premier caractere
       * apres l'espace et termine le mot par '\0'
       */
      pf++; /* pour pointer apres le slash */
      /* pf pointe sur le nom du fichier suivant le / de la requete.
       * Si la requete etait "GET /index.html ...", alors pf pointe sur
       * le "i" de "index.html"
       */

       //index
       if(strcmp("index.html",pf)==0){
            printf("he wants a index.html.\n");
            envoiRep(".",soc);
       }else{
           printf("he wants %s\n",pf);

      /* si le fichier est un fichier ordinaire, on l'envoie avec la fonction
       * envoiFichier().

       * Si c'est un repertoire, on envoie son listing avec la fonction
       * envoiRep().

       * Vous pouvez utiliser la fonction typeFichier() ci-dessous pour tester
       * le type du fichier.
       */

          /************ A completer ici**********/
          enum TypeFichier typef = typeFichier(pf);
          switch(typef){
            case ERREUR:
                //perror("error to know stat of the fichier\n");
                printf("File not exits\n");
                write(soc,ERROR404,strlen(ERROR404));
                break;
            case NORMAL:
                //file
                printf("This is normal file\n");
                //if true wait to send another one
                envoiFichier(pf,soc);
                break;
            case REPERTOIRE:
                //directory
                printf("This is normal directory\n");
                envoiRep(pf,soc);
                break;

        }

       }

  }

  close(soc);
}
Ejemplo n.º 3
0
void communication(int soc, struct sockaddr_storage from, socklen_t fromlen) {
  int s;
  char buf[BUFSIZE];
  ssize_t nread;
  char host[NI_MAXHOST];
  bool result;
  char *pf;
  enum op { GET, PUT } operation;

  /* Eventuellement, inserer ici le code pour la reconnaissance de la
   * machine appelante */
  	/* Reconnaissance de la machine cliente */
	s = getnameinfo((struct sockaddr *)&from, fromlen,
			host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
	if (s == 0)
	  printf("Client '%s'\n", host);
	else
	  fprintf(stderr, "getnameinfo: %s\n", gai_strerror(s));

  /* Reconnaissance de la requete */
  nread = read(soc, buf, BUFSIZE);
  if (nread > 0) {
    if (strncmp(buf, "GET", 3) == 0)
      operation = GET;
  } else {
    perror("Erreur lecture socket");
    return;
  }

  switch (operation) {
    case GET:
      pf = strtok(buf + 4, " ");
      /* On pointe alors sur le / de "GET /xxx HTTP...
       * strtok() rend l'adresse du premier caractere
       * apres l'espace et termine le mot par '\0'
       */
      pf++; /* pour pointer apres le slash */
      /* pf pointe sur le nom du fichier suivant le / de la requete.
       * Si la requete etait "GET /index.html ...", alors pf pointe sur
       * le "i" de "index.html"
       */
      /* si le fichier est un fichier ordinaire, on l'envoie avec la fonction
       * envoiFichier().
       * Si c'est un repertoire, on envoie son listing avec la fonction
       * envoiRep().
       * Vous pouvez utiliser la fonction typeFichier() ci-dessous pour tester
       * le type du fichier.
       */

      /************ A completer ici**********/
		if(typeFichier(pf) == NORMAL){	
			envoiFichier(pf,soc);
		}else if(typeFichier(pf) == REPERTOIRE){
			 envoiRep(pf,soc);
		}else{ 
			;
		}
	  break;
	case PUT:
	  perror("service not implmented!");
	  exit(-1);
  }

  close(soc);
}