Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}