From: Elena Balakhonova Date: Wed, 4 Dec 2019 11:56:48 +0000 (+0300) Subject: Limit simultaneous clients amount X-Git-Tag: v2.0.0~13 X-Git-Url: http://www.git.cypherpunks.ru/?p=gocheese.git;a=commitdiff_plain;h=0659f26ad2020eb9339fb4e276a44c01d897d709 Limit simultaneous clients amount --- diff --git a/go.mod b/go.mod index 9429346..a68b743 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module go.cypherpunks.ru/gocheese go 1.12 -require golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 +require ( + golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 + golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 +) diff --git a/go.sum b/go.sum index 791a997..66d418c 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,7 @@ 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= diff --git a/gocheese.go b/gocheese.go index 7a6d9ff..26c2c27 100644 --- a/gocheese.go +++ b/gocheese.go @@ -1,6 +1,7 @@ /* GoCheese -- Python private package repository and caching proxy Copyright (C) 2019 Sergey Matveev + 2019 Elena Balakhonova 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 @@ -28,6 +29,7 @@ import ( "io" "io/ioutil" "log" + "net" "net/http" "net/url" "os" @@ -38,6 +40,8 @@ import ( "strings" "syscall" "time" + + "golang.org/x/net/netutil" ) const ( @@ -70,6 +74,7 @@ var ( 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") @@ -447,10 +452,13 @@ func main() { 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) @@ -467,7 +475,7 @@ func main() { 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 {