12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- // Copyright 2020 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package proxyprotocol
-
- import (
- "net"
- "time"
- )
-
- // Listener is used to wrap an underlying listener,
- // whose connections may be using the HAProxy Proxy Protocol (version 1 or 2).
- // If the connection is using the protocol, the RemoteAddr() will return
- // the correct client address.
- //
- // Optionally define ProxyHeaderTimeout to set a maximum time to
- // receive the Proxy Protocol Header. Zero means no timeout.
- type Listener struct {
- Listener net.Listener
- ProxyHeaderTimeout time.Duration
- AcceptUnknown bool // allow PROXY UNKNOWN
- }
-
- // Accept implements the Accept method in the Listener interface
- // it waits for the next call and returns a wrapped Conn.
- func (p *Listener) Accept() (net.Conn, error) {
- // Get the underlying connection
- conn, err := p.Listener.Accept()
- if err != nil {
- return nil, err
- }
-
- newConn := NewConn(conn, p.ProxyHeaderTimeout)
- newConn.acceptUnknown = p.AcceptUnknown
- return newConn, nil
- }
-
- // Close closes the underlying listener.
- func (p *Listener) Close() error {
- return p.Listener.Close()
- }
-
- // Addr returns the underlying listener's network address.
- func (p *Listener) Addr() net.Addr {
- return p.Listener.Addr()
- }
|