Ejemplo n.º 1
0
char *ReadToken (server_request *ServerRequest)
{
	char *c = &ServerRequest->Request[ServerRequest->TokenizerIndex];
	if (!*c)
	{
		return NULL;
	}
	char *Start = c;
	s32 Length = 0;
	while (*c != 0 &&
		   *c != ' ' &&
		   *c != '\n' &&
		   *c != '\r')
	{
		++Length;
		++c;
	}

	if (!Length)
	{
		++ServerRequest->TokenizerIndex;
		return ReadToken(ServerRequest);
	}
	
	ServerRequest->TokenizerIndex += Length;

	char *Token = PushMemory(Length + 1);
	strncpy(Token, Start, Length);
	Token[Length] = 0;
	return Token;
}
Ejemplo n.º 2
0
void PoolAllocatorEx::TFree(void* ptr)
{
	LOCK(&m_lock);
	if(!ptr)
		return;

	PushMemory(ptr);
	if((int32)m_count > m_maxSize)
	{
		// free more memory
		for (int32 i=m_maxSize; i < m_count && m_head; ++i)
		{
			void* getPtr = PopMemory();
			if(!getPtr)
				return;

			void* realPtr = (void*)((char*)getPtr - sizeof(MemoryHead));
			dlfree(realPtr);
			m_memUsage -= m_cellSize;
			m_count--;
		}
	}
}
Ejemplo n.º 3
0
int main ()
{
	GetFileTypeForExtension("");
	InitMemory();

	printf("Staring server... \n");

	// int RequestBufferSize = 1000000;
	// char *RequestBuffer = (char*)malloc(RequestBufferSize);
	// ZeroMemory(RequestBuffer, RequestBufferSize);

	socket_handle ServerSocket = INVALID_SOCKET;
	socket_handle ConnectionSocket = INVALID_SOCKET;

	InitServerSocket(&ServerSocket);

	while (TRUE)
	{
		ClearMemory();

		s32 BufferSize = KiloBytes(1);
		char *Buffer = PushMemory(BufferSize);

		ConnectionSocket = accept(ServerSocket, NULL, NULL);
		if (ConnectionSocket == INVALID_SOCKET)
		{
			printf("Accept failed \n");
		}

		int RequestBytes = recv(ConnectionSocket, Buffer, BufferSize, 0);
		if (RequestBytes > 0)
		{
			// printf("Request bytes: %i \nRequest: %s \n", RecvResult, RequestBuffer);

			server_request ServerRequest = {0};
			ServerRequest.Request = Buffer;

			char *t;
			while (t = ReadToken(&ServerRequest))
			{
				if (!strcmp(t, "GET"))
				{
					char *t1 = ReadToken(&ServerRequest);
					ServerRequest.Get = t1;
				}
				if (!strcmp(t, "Host:"))
				{
					char *t1 = ReadToken(&ServerRequest);
					ServerRequest.Host = t1;
				}

				// printf("t: %s \n", t);
			}

			printf("Request: ");
			printf(ServerRequest.Get);
			printf("\n");

			#define Headers "HTTP/1.1 %i OK\r\n"\
							"Date: %s\r\n"\
							"Server: Linux\r\n"\
							"Accept-Ranges: none\r\n"\
							"Content-Type: %s\r\n"\
							"Content-Length: %i\r\n"\
							"Connection: close\r\n"\
							"\r\n""\0"



			char *Output = PushMemory(KiloBytes(20));
			if (ServerRequest.Get[0] == '/')
			{
				++ServerRequest.Get;
			}
			file_data FileData;
			char *FileName;
			if (*ServerRequest.Get)
			{
				FileName = ServerRequest.Get;
			}
			else
			{
				FileName = "index.html";
			}

			time_t tm;
			time(&tm);
			char *Date = PushMemory(KiloBytes(1));
			strftime(Date, KiloBytes(1), "%a, %d %b %Y %X GMT", localtime(&tm));

			char *Ext = strrchr(FileName, '.');
			if (!Ext)
			{
				char *fn = PushMemory(strlen(FileName) + 6);
				//FileName = fn;
				strcat(fn, FileName);
				strcat(fn, ".html\0");
				if (FExists(fn))
				{
					FileName = fn;
				}
			}

			FileData = FRead(FileName);

			// TODO: handle video files
			if (FileData.Data && strcmp(FileName, "404.html") && strcmp(FileName, "404"))
			{
				// char *Ext = PathFindExtensionA(FileName);
				char *Ext = strrchr(FileName, '.');
				char *HttpFileType;
				HttpFileType = GetFileTypeForExtension(Ext + 1);
				if (!HttpFileType)
				{
					HttpFileType = "text/html";
				}

				sprintf(Output, Headers, 200, Date, HttpFileType, FileData.Size);
				// memcpy(Output + strlen(Output), FileData.Data, FileData.Size);
				int SendResult;
				s32 HeaderBytesSent = send(ConnectionSocket, Output, strlen(Output), 0);
				s32 DataBytesSent = send(ConnectionSocket, FileData.Data, FileData.Size, 0);
				printf("HeaderBytesSent: %i \n", HeaderBytesSent);
				printf("DataBytesSent: %i \n", DataBytesSent);
				if (SendResult == SOCKET_ERROR)
				{
					printf("Send to client failed \n");
				}
				// SendResult = send(ConnectionSocket, FileData.Data, FileData.Size, 0);
				if (SendResult == SOCKET_ERROR)
				{
					printf("Send to client failed \n");
				}

#if 0
				FILE *f;
				f = fopen("assets/test.bmp", "w");
				if (f)
				{
					fwrite(FileData.Data, sizeof(char), FileData.Size, f);
					fclose(f);
				}
#endif
			}
			else
			{
				// char *PageNotFoundText = "<h1>Page not found</h1>";
				file_data File404 = FRead("404.html");
				if (File404.Data)
				{
					sprintf(Output, Headers, 404, Date, "text/html", File404.Size);
					int SendResult = send(ConnectionSocket, Output, strlen(Output), 0);
					send(ConnectionSocket, File404.Data, File404.Size, 0);
					if (SendResult == SOCKET_ERROR)
					{
						printf("Send to client failed \n");
					}
				}
			}
			
			closesocket(ConnectionSocket);

		}
		else
		{
			closesocket(ConnectionSocket);
		}
	}

	system("pause");
	return 0;
}