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