mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-23 22:27:38 -05:00
bac54de9eb
* Support for configurable connection pool. * ensure positive integer pool size config
60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
package fastcgi
|
|
|
|
import "sync"
|
|
|
|
type dialer interface {
|
|
Dial() (*FCGIClient, error)
|
|
Close(*FCGIClient) error
|
|
}
|
|
|
|
// basicDialer is a basic dialer that wraps default fcgi functions.
|
|
type basicDialer struct {
|
|
network, address string
|
|
}
|
|
|
|
func (b basicDialer) Dial() (*FCGIClient, error) { return Dial(b.network, b.address) }
|
|
func (b basicDialer) Close(c *FCGIClient) error { return c.Close() }
|
|
|
|
// persistentDialer keeps a pool of fcgi connections.
|
|
// connections are not closed after use, rather added back to the pool for reuse.
|
|
type persistentDialer struct {
|
|
size int
|
|
network string
|
|
address string
|
|
pool []*FCGIClient
|
|
sync.Mutex
|
|
}
|
|
|
|
func (p *persistentDialer) Dial() (*FCGIClient, error) {
|
|
p.Lock()
|
|
|
|
// connection is available, return first one.
|
|
if len(p.pool) > 0 {
|
|
client := p.pool[0]
|
|
p.pool = p.pool[1:]
|
|
p.Unlock()
|
|
|
|
return client, nil
|
|
}
|
|
|
|
p.Unlock()
|
|
|
|
// no connection available, create new one
|
|
return Dial(p.network, p.address)
|
|
}
|
|
|
|
func (p *persistentDialer) Close(client *FCGIClient) error {
|
|
p.Lock()
|
|
if len(p.pool) < p.size {
|
|
// pool is not full yet, add connection for reuse
|
|
p.pool = append(p.pool, client)
|
|
p.Unlock()
|
|
|
|
return nil
|
|
}
|
|
|
|
p.Unlock()
|
|
|
|
// otherwise, close the connection.
|
|
return client.Close()
|
|
}
|