golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
/*
GoCheese -- Python private package repository and caching proxy
Copyright (C) 2019 Sergey Matveev <stargrave@stargrave.org>
+ 2019 Elena Balakhonova <balakhonova_e@riseup.net>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
"io"
"io/ioutil"
"log"
+ "net"
"net/http"
"net/url"
"os"
"strings"
"syscall"
"time"
+
+ "golang.org/x/net/netutil"
)
const (
passwdPath = flag.String("passwd", "passwd", "Path to file with authenticators")
passwdCheck = flag.Bool("passwd-check", false, "Test the -passwd file for syntax errors and exit")
fsck = flag.Bool("fsck", false, "Check integrity of all packages")
+ maxClients = flag.Int("maxclients", 128, "Maximal amount of simultaneous clients")
version = flag.Bool("version", false, "Print version information")
warranty = flag.Bool("warranty", false, "Print warranty information")
killed := make(chan error, 0)
http.HandleFunc(*norefreshURLPath, handler)
http.HandleFunc(*refreshURLPath, handler)
+ ln, err := net.Listen("tcp", *bind)
+ if err != nil {
+ log.Fatal(err)
+ }
s := &http.Server{
- Addr: *bind,
- ReadTimeout: time.Minute,
- WriteTimeout: time.Minute,
+ ReadTimeout: time.Minute,
+ WriteTimeout: time.Minute,
}
signal.Notify(needsRefreshPasswd, syscall.SIGHUP)
signal.Notify(needsShutdown, syscall.SIGTERM, syscall.SIGINT)
killed <- s.Shutdown(ctx)
cancel()
}(s)
- if err := s.ListenAndServe(); err != http.ErrServerClosed {
+ if err := s.Serve(netutil.LimitListener(ln, *maxClients)); err != http.ErrServerClosed {
log.Fatal(err)
}
if err := <-killed; err != nil {