示例#1
0
void handle_request_socket(http_conf *g , struct epoll_event *evfd ) {

	epoll_extra_data_t * epoll_data = (epoll_extra_data_t *)evfd->data.ptr;

	http_connect_t *con = (http_connect_t *) epoll_data->ptr;

	if(con->in == NULL) {
		//accept_handler(g, con, evfd);
		epoll_edit_fd(g->epfd, evfd, EPOLL_W);
		return ;
		//epoll_del_fd(g->epfd, evfd);
	}
	while(con->next_handle != NULL) {
		int ret = con->next_handle(con);
		if(ret == DONE) {
			if(con->in->execute_file != NULL && con->in->execute_file->len > 0) {
				char *shPath = (char *)palloc(con->p, sizeof(char)*con->in->execute_file->len +1);
				strncpy(shPath, con->in->execute_file->ptr, con->in->execute_file->len);
				ds_log(con, " [send execute sh command:]", LOG_LEVEL_DEFAULT);
				send_execute_sh_cmd(con, g);
			}
			con->next_handle = NULL;
			epoll_del_fd(g->epfd, evfd);
			close(con->fd);
			ds_log(con, "  [END] ", LOG_LEVEL_DEFAULT);
			pool_destroy(con->p);
			//handle_request_destory(g, evfd);
		}else if(ret == CONTINUE) {
			break;
		}
	}
}
示例#2
0
int  open_write_file(http_connect_t *con)
{
    request * in;
    response *out;
    buffer *uri, *tmp, *dir;
    char *ptr ;
    FILE * fp;
    pool_t *p = con->p;
    int count = 0;

    in = con->in;
    out = con->out;


    uri = buffer_init(p);
    uri->ptr = in->uri->ptr;
    uri->used = uri->size = in->uri->len;


    dir = buffer_create_size(con->p, in->uri->len);
    memcpy(dir->ptr, uri->ptr, uri->used);
    ptr = dir->ptr + uri->used;
    dir->used = uri->used;
    while(ptr >= dir->ptr) {
        if(*ptr == '/') {
            *ptr = '\0';
            break;
        }
        ptr--;
        dir->used--;

    }

    uri->ptr[uri->used] = '\0';
    if(dir->used) {
        int ret  = _mkdir(con, dir->ptr, p);
        if(ret == -1) {
            return 0;
        }
    }

    ptr = (char *) palloc(p, sizeof(char)*2048);
    fp = fopen(uri->ptr, "w");

    if(fp) {
        make_fd_non_blocking(fileno(fp));
        con->write_file.fp = fp;
        con->write_file.len = 0;
        con->next_handle = write_file_content;
    } else {
        int logStrLen = strlen(dir) + 30;
        char * logStr = (char *) palloc(p, logStrLen);
        snprintf(logStr, logStrLen, "[access %s Permission denied]", dir );
        ds_log(con, logStr, LOG_LEVEL_ERROR);
        con->next_handle = send_put_forbidden_result;
    }


    return 0;
}
示例#3
0
void destory_connect(http_conf *g, http_connect_t *con, struct epoll_event * evfd) {
	if(con->in != NULL) {
		close(con->fd);
		ds_log(con, "  [END] ", LOG_LEVEL_DEFAULT);
		epoll_edit_fd(g->epfd, evfd, EPOLL_W);
		
		pool_destroy(con->p);
	}
	con->next_handle = NULL;
	epoll_del_fd(g->epfd, evfd);
}
示例#4
0
void handle_request_destory(http_conf *g, struct epoll_event *evfd ) {
	http_connect_t * con;
	epoll_data_t * epoll_data = (epoll_data_t *)evfd->data.ptr;

	con = (http_connect_t *) epoll_data->ptr;	
	if(con->in != NULL) {
		ds_log(con, "  [END] ", LOG_LEVEL_DEFAULT);
		epoll_edit_fd(g->epfd, evfd, EPOLL_W);
		
		pool_destroy(con->p);
		if(con->fd != 0 ) {
			close(con->fd);
		}

	}
	con->next_handle = NULL;
	epoll_del_fd(g->epfd, evfd);
}
示例#5
0
int accept_handler(http_connect_t *con)
{

 	//con->in = (request *)request_init(con->p);
 	//con->out = (response *)response_init(con->p);


	read_header(con);
	parse_header(con);
	ds_log(con, "  [ACCEPT] ", LOG_LEVEL_DEFAULT);
	if(con->in->http_method == _PUT) {
		//open_write_file(con);
		con->next_handle = open_write_file;
	} else {
		con->next_handle = NULL;
	}

	return 0;
}
示例#6
0
int start_accept(http_conf *g)
{
	int count;
	int confd  ;
	struct epoll_event ev[MAX_EVENT];
	struct epoll_event *evfd ;
	epoll_extra_data_t *epoll_data;
	struct sockaddr addr;
	struct sockaddr_in addrIn;
	socklen_t addLen = sizeof(struct sockaddr );


	start_web_server(g);

	printf("--------------- start server\n--------------");
	while(1){
		count = epoll_wait(g->epfd, ev, MAX_EVENT, -1);
		evfd = ev;
		while( (confd =  accept(g->fd, &addr, &addLen)) && confd > 0) {
			pool_t *p = (pool_t *)pool_create();
			http_connect_t * con;
			epoll_extra_data_t *data_ptr;

			addrIn =  *((struct sockaddr_in *) &addr);
			data_ptr = (epoll_extra_data_t *)palloc(p, sizeof(epoll_extra_data_t));
			con = (http_connect_t *) palloc(p, sizeof(http_connect_t));//换成初始化函数,
			con->p= p;
			con->fd = confd;
			con->in = (request *)request_init(p);
			con->out = (response *)response_init(p);
			char *ip  = NULL;
			if(addrIn.sin_addr.s_addr) {
				ip = inet_ntoa(addrIn.sin_addr);
			}

			if(ip) {
				con->in->clientIp = (string *) string_init_from_str(p, ip, strlen(ip));
			}

			con->next_handle = accept_handler;
			data_ptr->type = SOCKFD;
			data_ptr->ptr = (void *) con;
			epoll_add_fd(g->epfd, confd, EPOLL_R, (void *)data_ptr);//对epoll data结构指向的结构体重新封装,分websit
			//data struct ,  connect  data struct , file data struct ,
		}
		while((evfd->events & EPOLLIN)){
			if((evfd->events & EPOLLIN)) {
				http_connect_t * con;
				epoll_data = (epoll_data_t *)evfd->data.ptr;

				con = (http_connect_t *) epoll_data->ptr;
				switch(epoll_data->type) {
					case SOCKFD:
						if(con->in == NULL) {
							//accept_handler(g, con, evfd);
							epoll_edit_fd(g->epfd, evfd, EPOLL_W);
                            //epoll_del_fd(g->epfd, evfd);
						}
						while(con->next_handle != NULL) {
							int ret = con->next_handle(con);
							if(ret == -1) {
								con->next_handle = NULL;
								epoll_del_fd(g->epfd, evfd);
								close(con->fd);
								ds_log(con, "  [END] ", LOG_LEVEL_DEFAULT);
								pool_destroy(con->p);
							}else if(ret == 1) {
								break;
							}
                            /*if(con->next_handle(con) == -1) {
                            	epoll_del_fd(g->epfd, evfd);
                                close(con->fd);
                                pool_destroy(con->p);
                            }*/
						}
	 					break;
					case CGIFD: {
	 					epoll_cgi_t *cgi = (epoll_cgi_t *)epoll_data->ptr;
		 				break;
	 	 			}
	 	 		}


			}
			else if(evfd->events & EPOLLOUT) {

	 	 	}

	 	 	evfd++;
	 	}
	}
}