void sho_q(queue myque) { cout << "Current queue: "; while(!myque.empty()) cout << myque.get() << " "; cout << '\n'; myque.put(9.9); myque.put(7.7); cout << "Now the copy is: "; while(!myque.empty()) cout << myque.get() << " "; cout << '\n'; return; }
void* scheduler(void *t) { if(!DEBUG_MODE) { sleep(sleept); } struct requests r; int size=0; if (sched==FCFS) { while(1) { if(!q.empty()) { q.get(r,size); pthread_mutex_lock(&exec_queue); tqueue.add(r,size); pthread_mutex_unlock(&exec_queue); } } } else { while(1) { if(!q.empty()) { q.getshrt(r,size); pthread_mutex_lock(&exec_queue); tqueue.add(r,size); pthread_mutex_unlock(&exec_queue); } } } return NULL; }
void* execution_thread(void* d) { struct requests r; int k; bool flag=false; std::string log; while(1) { pthread_mutex_lock(&exec_queue); if (!tqueue.empty()) { tqueue.get(r,k); flag = true; } pthread_mutex_unlock(&exec_queue); if(flag) { log=r.log; //std::cout<<r.path<<std::endl; int ifsize=get_fsize(r.path); char fsize[4]; sprintf(fsize,"%d",ifsize); char filept[100]; strcpy(filept,r.path); if ( strncmp(r.http_ver, "HTTP/1.0", 8)!=0 && strncmp(r.http_ver, "HTTP/1.1", 8)!=0 ) { write(r.sockfd, "HTTP/1.0 400 Bad Request\r\n", 26); write (r.sockfd, "\r\n",2); char *tstamp=get_timestamp(); log.append("] ["); log.append(tstamp); write(r.sockfd,tstamp,(((std::string)tstamp).length()-1)); write (r.sockfd, "\r\n\r\n",4); shutdown (r.sockfd, SHUT_RDWR); close(r.sockfd); log.erase(log.length()-1); log.append("] \""); log.append(r.request_type); log.append(" "); log.append(r.path); log.append(" "); log.append(r.http_ver); log.erase(log.length()-1); log.append("\" 400 -1\n"); } else { if(!r.is_dir) { if(!r.path_found) { write (r.sockfd, "HTTP/1.0 404 Not Found\r\n", 24); write(r.sockfd, "Date: ",6); char *tstamp=get_timestamp(); log.append("] ["); log.append(tstamp); write(r.sockfd,tstamp,(((std::string)tstamp).length()-1)); write(r.sockfd,"\r\n",2); write(r.sockfd, "Server: ",8); write(r.sockfd, "Myhttpd/1.0\r\n",13); write(r.sockfd, "Content-Type: text/html\r\n",25); write (r.sockfd, "\r\n",2); shutdown (r.sockfd, SHUT_RDWR); close(r.sockfd); log.erase(log.length()-1); log.append("] \""); log.append(r.request_type); log.append(" "); log.append(r.path); log.append(" "); log.append(r.http_ver); log.erase(log.length()-1); log.append("\" 404 -1\n"); } else { char *ftype=filetype(filept); if( strncmp(r.request_type,"GET\0",4)==0) { FILE *f; char *content=new char[ifsize]; int bytes=0; write(r.sockfd, "HTTP/1.0 200 OK\r\n", 17); write(r.sockfd, "Date: ",6); char *tstamp=get_timestamp(); log.append("] ["); log.append(tstamp); write(r.sockfd,tstamp,(((std::string)tstamp).length()-1)); write(r.sockfd,"\r\n",2); write(r.sockfd, "Server: ",8); write(r.sockfd, "Myhttpd/1.0\r\n",13); write(r.sockfd, "Last-Modified: ",15); write(r.sockfd,get_lastm(r.path),(((std::string)get_lastm(r.path)).length()-1)); write(r.sockfd,"\r\n",2); write(r.sockfd,"Content-Type: ",14); if((ftype==NULL)) { write(r.sockfd,"text/html\r\n",11); } else { if((strncmp(ftype,"html",4)==0)||(strncmp(ftype,"txt",3)==0)) { write(r.sockfd,"text/html\r\n",11); } if ((strncmp(ftype,"gif",3)==0)||(strncmp(ftype,"jpg",3)==0)) { write(r.sockfd,"image/gif\r\n",11); } } write(r.sockfd, "Content-Length: ",16); write(r.sockfd,(char *)fsize,strlen(fsize)); write(r.sockfd,"\r\n\r\n",4); f=fopen(r.path,"rb"); while((bytes=fread(content,sizeof(char),ifsize,f))>0) { write(r.sockfd,content,bytes); } fclose(f); delete content; write(r.sockfd,"\r\n",2); shutdown (r.sockfd, SHUT_RDWR); close(r.sockfd); log.erase(log.length()-1); log.append("] \""); log.append(r.request_type); log.append(" "); log.append(r.path); log.append(" "); log.append(r.http_ver); log.erase(log.length()-1); log.append("\" 200 "); log.append(fsize); log.append("\n"); } else { write(r.sockfd, "HTTP/1.0 200 OK\r\n", 17); write(r.sockfd, "Date: ",6); char *tstamp=get_timestamp(); log.append("] ["); log.append(tstamp); write(r.sockfd,tstamp,(((std::string)tstamp).length()-1)); write(r.sockfd,"\r\n",2); write(r.sockfd, "Server: ",8); write(r.sockfd, "Myhttpd/1.0\r\n",13); write(r.sockfd, "Last-Modified: ",15); write(r.sockfd,get_lastm(r.path),(((std::string)get_lastm(r.path)).length()-1)); write(r.sockfd,"\r\n",2); write(r.sockfd,"Content-Type: ",14); if((ftype==NULL)) { write(r.sockfd,"text/html\r\n",11); } else { if((strncmp(ftype,"html",4)==0)||(strncmp(ftype,"txt",3)==0)) { write(r.sockfd,"text/html\r\n",11); } if ((strncmp(ftype,"gif",3)==0)||(strncmp(ftype,"jpg",3)==0)) { write(r.sockfd,"image/gif\r\n",11); } } write(r.sockfd, "Content-Length: ",16); write(r.sockfd,(char *)fsize,strlen(fsize)); write(r.sockfd,"\r\n\r\n",4); shutdown (r.sockfd, SHUT_RDWR); close(r.sockfd); log.erase(log.length()-1); log.append("] \""); log.append(r.request_type); log.append(" "); log.append(r.path); log.append(" "); log.append(r.http_ver); log.erase(log.length()-1); log.append("\" 200 "); log.append(fsize); log.append("\n"); } } } else { DIR *directory=opendir(r.path); if(directory==NULL) { write (r.sockfd, "HTTP/1.0 404 Not Found\r\n", 24); write(r.sockfd, "Date: ",6); char *tstamp=get_timestamp(); log.append("] ["); log.append(tstamp); write(r.sockfd,tstamp,(((std::string)tstamp).length()-1)); write(r.sockfd,"\r\n",2); write(r.sockfd, "Server: ",8); write(r.sockfd, "Myhttpd/1.0\r\n",13); write(r.sockfd, "Content-Type: text/html\r\n",25); write (r.sockfd, "\r\n",2); shutdown (r.sockfd, SHUT_RDWR); close(r.sockfd); log.erase(log.length()-1); log.append("] \""); log.append(r.request_type); log.append(" "); log.append(r.path); log.append(" "); log.append(r.http_ver); log.erase(log.length()-1); log.append("\" 404 -1\n"); } else { strcat(filept,"index.html"); int f2size; char dir_size[4]; if( strncmp(r.request_type,"GET\0",4)==0) { if((f2size=get_fsize(filept))==-1) { std::string files_here; struct dirent *dir_ent=NULL; int i=0; dir_ent=readdir(directory); while(dir_ent!=NULL) { if(dir_ent->d_name[0]!='.') { files_here.append(dir_ent->d_name); files_here.append("\n"); } i++; dir_ent=readdir(directory); } write(r.sockfd, "HTTP/1.0 200 OK\r\n", 17); write(r.sockfd, "Date: ",6); char *tstamp=get_timestamp(); log.append("] ["); log.append(tstamp); write(r.sockfd,tstamp,(((std::string)tstamp).length()-1)); write(r.sockfd,"\r\n",2); write(r.sockfd, "Server: ",8); write(r.sockfd, "Myhttpd/1.0\r\n",13); write(r.sockfd, "Last-Modified: ",15); write(r.sockfd,get_lastm(filept),(((std::string)get_lastm(filept)).length()-1)); write(r.sockfd,"\r\n",2); write(r.sockfd,"Content-Type: text/html\r\n",25); write(r.sockfd, "Content-Length: ",16); sprintf(dir_size,"%d",files_here.length()); write(r.sockfd,(char *)dir_size,strlen(dir_size)); write(r.sockfd,"\r\n\r\n",4); write(r.sockfd,files_here.data(),files_here.length()); write(r.sockfd,"\r\n",2); shutdown (r.sockfd, SHUT_RDWR); close(r.sockfd); log.erase(log.length()-1); log.append("] \""); log.append(r.request_type); log.append(" "); log.append(r.path); log.append(" "); log.append(r.http_ver); log.erase(log.length()-1); log.append("\" 200 "); log.append(dir_size); log.append("\n"); } else { FILE *f; int bytes; char *content=new char[f2size]; write(r.sockfd, "HTTP/1.0 200 OK\r\n", 17); write(r.sockfd, "Date: ",6); char *tstamp=get_timestamp(); log.append("] ["); log.append(tstamp); write(r.sockfd,tstamp,(((std::string)tstamp).length()-1)); write(r.sockfd,"\r\n",2); write(r.sockfd, "Server: ",8); write(r.sockfd, "Myhttpd/1.0\r\n",13); write(r.sockfd, "Last-Modified: ",15); write(r.sockfd,get_lastm(filept),(((std::string)get_lastm(filept)).length()-1)); write(r.sockfd,"\r\n",2); write(r.sockfd,"Content-Type: text/html\r\n",25); write(r.sockfd, "Content-Length: ",16); sprintf(dir_size,"%d",f2size); write(r.sockfd,(char *)dir_size,strlen(dir_size)); write(r.sockfd,"\r\n\r\n",4); f=fopen(filept,"rb"); while((bytes=fread(content,sizeof(char),ifsize,f))>0) { write(r.sockfd,content,bytes); } fclose(f); delete content; shutdown (r.sockfd, SHUT_RDWR); close(r.sockfd); log.erase(log.length()-1); log.append("] \""); log.append(r.request_type); log.append(" "); log.append(r.path); log.append(" "); log.append(r.http_ver); log.erase(log.length()-1); log.append("\" 200 "); log.append(dir_size); log.append("\n"); } } else { if((f2size=get_fsize(filept))==-1) { std::string files_here; struct dirent *dir_ent=NULL; dir_ent=readdir(directory); while(dir_ent!=NULL) { if(dir_ent->d_name[0]!='.') { files_here.append(dir_ent->d_name); files_here.append("\r\n"); } dir_ent=readdir(directory); } write(r.sockfd, "HTTP/1.0 200 OK\r\n", 17); write(r.sockfd, "Date: ",6); char *tstamp=get_timestamp(); log.append("] ["); log.append(tstamp); write(r.sockfd,tstamp,(((std::string)tstamp).length()-1)); write(r.sockfd,"\r\n",2); write(r.sockfd, "Server: ",8); write(r.sockfd, "Myhttpd/1.0\r\n",13); write(r.sockfd, "Last-Modified: ",15); write(r.sockfd,get_lastm(filept),(((std::string)get_lastm(filept)).length()-1)); write(r.sockfd,"\r\n",2); write(r.sockfd,"Content-Type: text/html\r\n",25); write(r.sockfd, "Content-Length: ",16); sprintf(dir_size,"%d",files_here.length()); write(r.sockfd,(char *)dir_size,strlen(dir_size)); write(r.sockfd,"\r\n\r\n",4); shutdown (r.sockfd, SHUT_RDWR); close(r.sockfd); log.erase(log.length()-1); log.append("] \""); log.append(r.request_type); log.append(" "); log.append(r.path); log.append(" "); log.append(r.http_ver); log.erase(log.length()-1); log.append("\" 200 "); log.append(dir_size); log.append("\n"); } else { write(r.sockfd, "HTTP/1.0 200 OK\r\n", 17); write(r.sockfd, "Date: ",6); char *tstamp=get_timestamp(); log.append("] ["); log.append(tstamp); write(r.sockfd,tstamp,(((std::string)tstamp).length()-1)); write(r.sockfd,"\r\n",2); write(r.sockfd, "Server: ",8); write(r.sockfd, "Myhttpd/1.0\r\n",13); write(r.sockfd, "Last-Modified: ",15); write(r.sockfd,get_lastm(filept),(((std::string)get_lastm(filept)).length()-1)); write(r.sockfd,"\r\n",2); write(r.sockfd,"Content-Type: text/html\r\n",25); write(r.sockfd, "Content-Length: ",16); sprintf(dir_size,"%d",f2size); write(r.sockfd,(char *)dir_size,strlen(dir_size)); write(r.sockfd,"\r\n\r\n",4); shutdown (r.sockfd, SHUT_RDWR); close(r.sockfd); log.erase(log.length()-1); log.append("] \""); log.append(r.request_type); log.append(" "); log.append(r.path); log.append(" "); log.append(r.http_ver); log.erase(log.length()-1); log.append("\" 200 "); log.append(dir_size); log.append("\n"); } } } } } logger(log); if(DEBUG_MODE) { REQUEST_SERVED=true; } } flag=false; } return NULL; }