Newer
Older
ubServ / parse.c
#include "include/httpd.h"

int parse(int i, hash *socket) {
  char *a,*b,*c,*d;
  if (!strcmp(socket[i].data,"\n")) {
    sendpage(i,socket);
    printf("Closed Socket\n");
//    close(socket[i].socket);
//    socket[i].socket = 0;
    return -1;
    }
  if (strstr(socket[i].data,"Connection:")) {
    a = strtok(socket[i].data," ");
    b = strtok(NULL,"\n");
    sprintf(socket[i].connection,b);
    } 
  if (strstr(socket[i].data,"GET")) {
    a = strtok(socket[i].data, " ");
    b = strtok(NULL,"\n");
    if (strstr(b, " ")) {
      c = strtok(b, " ");
      d = strtok(NULL, "\n");
      }
    if (!strcmp(b,"/")) {
      sprintf(socket[i].location,"/index.html");
      }
    else {
      sprintf(socket[i].location,b);
      }
    sprintf(socket[i].method,a);
    if (strstr(b,"jpg")) { sprintf(socket[i].contenttype,"image/jpeg"); }
    else if (strstr(b,"gif")) { sprintf(socket[i].contenttype,"image/gif"); }
    else { sprintf(socket[i].contenttype,"text/html"); }
    }
  return -1;
  }


int sendpage(int i,hash *socket) {
  int ch,h;
  char file[128],header[256];
  char *input;
  struct stat sb;
  struct dirent *dp;
  DIR *d;
  printf("Sending Page [%i] - File: %s - File2: %c\n", i,socket[i].location,socket[i].location[strlen(socket[i].location)-1]);
  if (socket[i].location[strlen(socket[i].location)-1] == '/') {
    printf("Gotcha");
    socket[i].location[strlen(socket[i].location)-1] = '\0';
    }
  sprintf(file, "/usr/home/reddawg/htdocs%s",socket[i].location);
  if (stat(file,&sb) == -1) {
    printf("Sorry File Does Not Exist\n");
    sprintf(file,"/home/reddawg/htdocs/notfound.html");
    stat(file,&sb);
    }
  printf("%ld\n",sb.st_mode);
  if (sb.st_mode == 16877) {
    sprintf(header, "HTTP/1.1 200 OK\nServer: UbieServer/0.1 (FreeBSD)\nConnection: close\nContent-Type: text/html\n\n");
    }
  else {
    sprintf(header, "HTTP/1.1 200 OK\nServer: UbieServer/0.1 (FreeBSD)\nAccept-Ranges: bytes\nContent-Length: %ld\n", sb.st_size);
    sprintf(header,"%sConnection: %s\n",header,socket[i].connection);
    sprintf(header,"%sContent-Type: %s\n\n",header,socket[i].contenttype);
    }
  send_to_sock(socket[i].socket,header);
  if (sb.st_mode == 16877) {
    d = opendir(file);
    while ((dp = readdir(d)) != NULL) {
      if (!strcmp(dp->d_name,"..")) {
        sprintf(file,"<A HREF=\"%s\">Parent Directory</A><BR>\n",socket[i].parentdir);
        }
      else if (!strcmp(dp->d_name,".")) { sprintf(file,""); }
      else {
        sprintf(file,"<A HREF=\"%s/%s\">%s</A><BR>\n",socket[i].location,dp->d_name,dp->d_name);
        }
      printf("Link: %s\n", file);
      h = write(socket[i].socket,file,strlen(file));
      printf("Dir: %i\n", h);
      }
    sprintf(socket[i].parentdir,socket[i].location); 
    closedir(d);
    return(0);
    }  
  fd = fopen(file,"rb");
  input = malloc(1);
  printf("Start Sending %s\n",file);
  while((ch = fgetc(fd)) != EOF) {
    sprintf(input, "%c", ch);
    write(socket[i].socket,input,1);
    }
  printf("[%i]",strlen(input));
  write(socket[i].socket,input,strlen(input));
   
  printf("Done Sending\n");
  return 0;
  }