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; } } }
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); }
int accept_handler(http_conf_t *conf, http_connect_t *con, struct epoll_event *ev) { con->in = (request *)request_init(con->p); if(read_header(con) == 0) { if(con->in->header == NULL || con->in->header->used <= 0) { send_bad_request(con->fd); epoll_del_fd(conf->epfd, ev); close(con->fd); pool_destroy(con->p); return -1; } parse_header(con); //list_buffer_to_lower(con->in->header); con->next_handle = authorized_handle; virtual_port_match(conf, con); epoll_edit_fd(conf->epfd, ev, EPOLL_W); /*是否需要登录 *提交方式 *主页匹配 *压缩 *发送数据 */ //http_connect_t *con; //con = ev[count].data.ptr; con->out = (response *)response_init(con->p); while(con->next_handle != NULL && con->next_handle(conf, con) == 0){ } epoll_del_fd(conf->epfd, ev); } return 0; }
void epoll_handle_data(epoll_t *epol, int peerfd) { char recvbuf[1024]; int ret = readline(peerfd, recvbuf, 1024); if(ret == -1) ERR_EXIT("readline"); else if(ret == 0) { printf("client close\n"); epoll_del_fd(epol, peerfd); return; } epol->handle_callback_(peerfd, recvbuf); }
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); }
int accept_handler(http_conf *g, http_connect_t *con, struct epoll_event *ev) { con->in = (request *)request_init(con->p); con->out = (response *)request_init(con->p); read_header(con); parse_header(con); epoll_edit_fd(g->epfd, ev, EPOLL_W); epoll_del_fd(g->epfd, ev); if(con->in->http_method == _PUT) { open_write_file(con); con->next_handle = write_file_content; } /*close(con->fd); pool_destroy(con->p);*/ return 0; }
int start_accept(http_conf *g) { int count; struct epoll_event ev[MAX_EVENT]; epoll_extra_data_t *epoll_data; start_web_server(g); printf("--------------- start server\n--------------"); while(1){ count = epoll_wait(g->epfd, ev, MAX_EVENT, -1); while(count-- > 0){ epoll_data = (epoll_data_t *)ev[count].data.ptr; if(epoll_data->type == SERVERFD) { int confd = accept(g->fd, NULL, NULL); pool_t *p = (pool_t *)pool_create(); http_connect_t * con; epoll_extra_data_t *data_ptr; 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; 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 , } else if((ev[count].events & EPOLLIN)) { http_connect_t * con; con = (http_connect_t *) epoll_data->ptr; switch(epoll_data->type) { case SOCKFD: if(con->in == NULL) { accept_handler(g, con, ev+count); } if(con->next_handle != NULL) { con->next_handle(con); } else { epoll_del_fd(g->epfd, ev); close(con->fd); pool_destroy(con->p); } break; case CGIFD: { epoll_cgi_t *cgi = (epoll_cgi_t *)epoll_data->ptr; break; } } } else if(ev[count].events & EPOLLOUT) { } } } }
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++; } } }
int start_accept(http_conf_t *conf) { int count; struct epoll_event ev[MAX_EVENT]; epoll_extra_data_t *epoll_data; struct epoll_event * evfd; int evIndex ; start_web_server(conf); printf("--------------- start server\n--------------"); while(1){ count = epoll_wait(conf->epfd, ev, MAX_EVENT, -1); http_accept_request_socket(conf, conf->fd); if(count < 0) { count = 0;} for(evIndex = 0; evIndex < count; evIndex++) { evfd = ev + evIndex; epoll_data = (epoll_extra_data_t *)evfd->data.ptr; if(epoll_data->type != SERVERFD && (evfd->events & EPOLLIN)) { http_connect_t * con; con = (http_connect_t *) epoll_data->ptr; switch(epoll_data->type) { case SOCKFD: accept_handler(conf, con, evfd); break; case CGIFD: { epoll_cgi_t *cgi = (epoll_cgi_t *)epoll_data->ptr; if(read_cgi(cgi) == 0) { list_buffer_used_to_zero(cgi->cgi_data); if(cgi_parse_handler(cgi) == 0) { } else { } epoll_del_fd(conf->epfd, evfd); pool_destroy(cgi->con->p); close(cgi->con->fd); } else { } break; } case SERVERFD: //有多个web配置的时候可用 以后测试 //http_accept_request_socket(g, con->fd); //接受连接 break; } } else if(evfd->events & EPOLLOUT) { }else if(evfd->events & EPOLLRDHUP) { http_connect_t * con; epoll_data = (epoll_data_t *)evfd->data.ptr; con = (http_connect_t *) epoll_data->ptr; if(con->in != NULL) { epoll_edit_fd(conf->epfd, evfd, EPOLL_W); pool_destroy(con->p); close(con->fd); } con->next_handle = NULL; epoll_del_fd(conf->epfd, evfd); } } } }