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;
}