gfcontext_t *BuildContextFromRequestString(char *request) { char *delimiter = " "; char *saveptr; printf("Parsing request string [%s]\n", request); gfcontext_t *context = malloc(sizeof(gfcontext_t)); context->Scheme = ParseScheme(strtok_r(request, delimiter, &saveptr)); context->Method = ParseMethod(strtok_r(NULL, delimiter, &saveptr)); context->FilePath = strtok_r(NULL, delimiter, &saveptr); context->Status = GF_OK; if(context->Scheme == NO_SCHEME) { printf("Parsed scheme [%d] is not a known scheme.", context->Scheme); context->Status = GF_ERROR; return context; } if(context->Method == NO_METHOD) { printf("Parsed method [%d] is not a known method.", context->Method); context->Status = GF_ERROR; return context; } if(!IsValidFilePath(context->FilePath)) { printf("Parsed file path [%s] is not a known path.", context->FilePath); context->Status = GF_ERROR; return context; } printf("Context.Scheme: %d\n", context->Scheme); printf("Context.Method: %d\n", context->Method); printf("Context.FilePath: %s\n", context->FilePath); return context; }
int main() { int res = 0; //chdir(WorkDir); stdoutfd = dup(STDOUT_FILENO); stderrfd = dup(STDERR_FILENO); CreateConnection(); /*** when a connection comes ***/ for(;;) { clilen = sizeof(cli_addr); connfd = accept(listenfd, (struct sockaddr*)&cli_addr, &clilen); if(clientCount < LISTEN_MAX_NUM) { if(connfd < 0) { printf("error: accept error (errno: %d - %s)\n", errno, strerror(errno));fflush(stdout); close(connfd); bzero(&curClient, sizeof(curClient)); bzero(&cli_addr, sizeof(cli_addr)); clilen = 0; connfd = 0; } else { printf("accept\n");fflush(stdout); NewClient(); /*** read request ***/ if( (res = ReadRequest()) < 0) continue; /*** send status response ***/ write(curClient.fd, contentType, strlen(contentType)); write(curClient.fd, status200, strlen(status200)); /*** fork a child process for client ***/ if( (childPid = fork()) == -1) { printf("error: fork() error (errno: %d - %s)\n", errno, strerror(errno));fflush(stdout); Disconnect(); } else if(childPid == 0) { /*** child process: client work environment ***/ close(listenfd); listenfd = -1; /*** parse headers ***/ char method[5]; char target[HEADER_MAX_LEN]; char queryString[HEADER_MAX_LEN]; ParseMethod(method, target, queryString); /*** execute method ***/ ExectueMethod(); exit(0); } else { /*** parent process ***/ close(connfd); bzero(&curClient, sizeof(curClient)); bzero(&cli_addr, sizeof(cli_addr)); clilen = 0; connfd = 0; bzero(buffer, BUF_MAX_SIZE); bzero(request, sizeof(request)); } } } else { printf("error: too many clients now (errno: %d - %s)\n", errno, strerror(errno));fflush(stdout); close(connfd); bzero(&cli_addr, sizeof(cli_addr)); clilen = 0; connfd = 0; } } return 0; }