package main import ( "encoding/json" "io" "log" "net/http" "os" ) func init() { log.SetFlags(log.Lmicroseconds | log.Lshortfile) logFile, err := os.Create("main.log") if err != nil { log.Printf("Error creating log file: %v", err) os.Exit(1) } logger := io.MultiWriter(os.Stdout, logFile) log.SetOutput(logger) } const DOWNLOAD_WORKERS = 10 var downloadQueue = make(chan *DownloadTask, 100) func enableCORS(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS") w.Header().Set("Access-Control-Allow-Headers", "Content-Type") if r.Method == http.MethodOptions { w.WriteHeader(http.StatusOK) return } next.ServeHTTP(w, r) }) } func handleDownload(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { http.Error(w, "Invalid request method", http.StatusMethodNotAllowed) return } var req DownloadRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { log.Printf("Error parsing JSON: %v", err) http.Error(w, "Error parsing JSON", http.StatusBadRequest) return } downloadQueue <- &DownloadTask{Url: req.Link} w.WriteHeader(http.StatusOK) } func main() { for i := 0; i < DOWNLOAD_WORKERS; i++ { worker := &DownloadWorker{id: i, input: downloadQueue} go worker.Run() } mux := http.NewServeMux() mux.Handle("/download", enableCORS(http.HandlerFunc(handleDownload))) log.Println("Server starting on :5000") err := http.ListenAndServe(":5000", mux) if err != nil { log.Println("Error starting server:", err) } }