void close_client(epdata_t *epd) { if(!epd) { return; } if(epd->ssl && epd->fd > -1) { if(!SSL_shutdown(epd->ssl)) { shutdown(epd->fd, 1); SSL_shutdown(epd->ssl); } SSL_free(epd->ssl); epd->ssl = NULL; } if(epd->L) { if(epd->status == STEP_PROCESS) { LOGF(ERR, "at working!!!"); } release_lua_thread(epd->L); epd->L = NULL; } if(epd->status == STEP_READ) { serv_status.reading_counts--; } else if(epd->status == STEP_SEND) { serv_status.sending_counts--; } se_delete(epd->se_ptr); delete_timeout(epd->timeout_ptr); epd->timeout_ptr = NULL; if(epd->fd > -1) { serv_status.active_counts--; close(epd->fd); epd->fd = -1; } free_epd(epd); }
void close_client ( epdata_t *epd ) { if ( !epd ) { return; } if ( epd->status == STEP_READ ) { serv_status.reading_counts--; } else if ( epd->status == STEP_SEND ) { serv_status.sending_counts--; } se_delete ( epd->se_ptr ); delete_timeout ( epd->timeout_ptr ); epd->timeout_ptr = NULL; if ( epd->fd > -1 ) { serv_status.active_counts--; close ( epd->fd ); epd->fd = -1; } if ( epd->websocket ) { if ( epd->websocket->websocket_handles > 0 ) { luaL_unref ( epd->websocket->ML, LUA_REGISTRYINDEX, epd->websocket->websocket_handles ); } lua_resume ( epd->websocket->ML, 0 ); free ( epd->websocket ); epd->websocket = NULL; } free_epd ( epd ); }
void network_be_end ( epdata_t *epd ) // for lua function die { if ( epd->process_timeout == 1 && epd->keepalive != -1 ) { epd->process_timeout = 0; free_epd ( epd ); return; } //printf ( "network_be_end %d\n" , ((se_ptr_t*)epd->se_ptr)->fd ); update_timeout ( epd->timeout_ptr, STEP_SEND_TIMEOUT ); se_be_write ( epd->se_ptr, network_be_write ); serv_status.success_counts++; epd->status = STEP_SEND; serv_status.sending_counts++; if ( epd->iov[0].iov_base == NULL && epd->iov[1].iov_base == NULL && epd->response_sendfile_fd == -1 ) { serv_status.sending_counts--; network_send_error ( epd, 417, "" ); } else if ( epd->response_sendfile_fd == -2 ) { epd->response_sendfile_fd = -1; serv_status.sending_counts--; network_send_error ( epd, 404, "File Not Found!" ); } else { int gzip_data = 0; //printf("%d %s\n", epd->response_content_length, epd->iov[1].iov_base); if ( epd->response_content_length > 1024 && epd->iov[1].iov_base && !is_binary ( epd->iov[1].iov_base, epd->iov[1].iov_len ) ) { char *p = NULL; if ( epd->headers ) { p = stristr ( epd->headers, "Accept-Encoding", epd->header_len ); } if ( p ) { p += 16; int i = 0, m = strlen ( p ); for ( ; i < 20 && i < m; i++ ) { if ( p[i] == '\n' ) { break; } } p[i] = '\0'; if ( strstr ( p, "deflate" ) ) { gzip_data = 2; } else if ( strstr ( p, "gzip" ) ) { gzip_data = 1; } p[i] = '\n'; } } if ( gzip_data > 0 ) epd->response_content_length = gzip_iov ( gzip_data, ( struct iovec * ) &epd->iov, epd->iov_buf_count, &epd->iov_buf_count ); int len = 0; if ( epd->iov[0].iov_base == NULL ) { len = sprintf ( temp_buf, "HTTP/1.1 200 OK\r\nServer: aLiLua/%s (%s)\r\nContent-Type: text/html; charset=UTF-8\r\nConnection: %s\r\n%sContent-Length: %d\r\n\r\n", version, hostname, ( epd->keepalive == 1 ? "keep-alive" : "close" ), ( gzip_data == 1 ? "Content-Encoding: gzip\r\n" : ( gzip_data == 2 ? "Content-Encoding: deflate\r\n" : "" ) ), epd->response_content_length + ( gzip_data == 1 ? 10 : 0 ) ); epd->response_header_length = len; } else { //( ( char * ) ( epd->iov[0].iov_base ) ) [epd->response_header_length] = '\0'; memcpy ( temp_buf, epd->iov[0].iov_base, epd->response_header_length ); len = epd->response_header_length + sprintf ( temp_buf + epd->response_header_length, "Server: aLiLua/%s (%s)\r\nConnection: %s\r\nDate: %s\r\n%sContent-Length: %d\r\n\r\n", version, hostname, ( epd->keepalive == 1 ? "keep-alive" : "close" ), now_date, ( gzip_data == 1 ? "Content-Encoding: gzip\r\n" : ( gzip_data == 2 ? "Content-Encoding: deflate\r\n" : "" ) ), epd->response_content_length + ( gzip_data == 1 ? 10 : 0 ) ); epd->response_header_length += len; } if ( len < 4086 && epd->response_sendfile_fd <= -1 && epd->iov[1].iov_base && epd->iov[1].iov_len > 0 ) { if ( epd->iov[0].iov_base == NULL ) { epd->iov[0].iov_base = malloc ( EP_D_BUF_SIZE ); } if ( epd->iov[0].iov_base == NULL ) { epd->keepalive = 0; network_end_process ( epd ); serv_status.sending_counts--; return; } memcpy ( epd->iov[0].iov_base, temp_buf, len ); epd->iov[0].iov_len = len; epd->response_content_length += len; if ( gzip_data == 1 ) { memcpy ( epd->iov[0].iov_base + len, gzip_header, 10 ); epd->iov[0].iov_len += 10; epd->response_content_length += 10; } epd->iov_buf_count += 1; } else { network_raw_send ( epd->fd, temp_buf, len ); if ( gzip_data == 1 ) { network_raw_send ( epd->fd, gzip_header, 10 ); } free ( epd->iov[0].iov_base ); epd->iov[0].iov_base = NULL; int i = 0; for ( i = 0; i < epd->iov_buf_count; i++ ) { epd->iov[i] = epd->iov[i + 1]; epd->iov[i + 1].iov_base = NULL; epd->iov[i + 1].iov_len = 0; } } //epd->response_header_length = 0; //printf("%d\n", epd->response_header_length); if ( epd->response_content_length == 0 ) { network_end_process ( epd ); serv_status.sending_counts--; } else { epd->response_buf_sended = 0; } } }