mirror of
https://github.com/caddyserver/caddy.git
synced 2024-11-26 02:09:47 +08:00
8cb4e90852
* keep fastcgi connection open * poor mans serialisation to make up for the lack of demuxing * pointing includes to echse's repo * Revert "pointing includes to echse's repo" This reverts commit281daad8d4
. * switch for persistent fcgi connections on/off added * fixing ineffectual assignments * camel case instead of _ * only activate persistent sockets on windows (and some naming conventions/cleanup) * gitfm import sorting * Revert "fixing ineffectual assignments" This reverts commit79760344e7
. # Conflicts: # caddyhttp/staticfiles/fileserver.go * added another mutex and deleting map entries. thx to mholts QA comments! * thinking about it, this RW lock was not a good idea here * thread safety * I keep learning about mutexs in go * some cosmetics * adding persistant fastcgi connections switch to directive * Support for configurable connection pool. * ensure positive integer pool size config * abisofts pool fix + nicer logging for the fastcgi_test * abisoft wants to have dialer comparison in _test instead of next to struct * Do not put dead connections back into pool * Fix fastcgi header error * Do not put dead connections back into pool * some code style improvements from the discussion in https://github.com/mholt/caddy/pull/1134 * abisofts naming convention
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()
|
|
}
|