支持PROXY Protocol
(conn net.Conn, req *HTTPRequest, proxyProtocol *serverconfigs.ProxyProtocolConfig)
| 266 | |
| 267 | // 支持PROXY Protocol |
| 268 | func (this *HTTPClientPool) handlePROXYProtocol(conn net.Conn, req *HTTPRequest, proxyProtocol *serverconfigs.ProxyProtocolConfig) error { |
| 269 | if proxyProtocol != nil && |
| 270 | proxyProtocol.IsOn && |
| 271 | (proxyProtocol.Version == serverconfigs.ProxyProtocolVersion1 || proxyProtocol.Version == serverconfigs.ProxyProtocolVersion2) { |
| 272 | var remoteAddr = req.requestRemoteAddr(true) |
| 273 | var transportProtocol = proxyproto.TCPv4 |
| 274 | if strings.Contains(remoteAddr, ":") { |
| 275 | transportProtocol = proxyproto.TCPv6 |
| 276 | } |
| 277 | var destAddr = conn.RemoteAddr() |
| 278 | var reqConn = req.RawReq.Context().Value(HTTPConnContextKey) |
| 279 | if reqConn != nil { |
| 280 | destAddr = reqConn.(net.Conn).LocalAddr() |
| 281 | } |
| 282 | var header = proxyproto.Header{ |
| 283 | Version: byte(proxyProtocol.Version), |
| 284 | Command: proxyproto.PROXY, |
| 285 | TransportProtocol: transportProtocol, |
| 286 | SourceAddr: &net.TCPAddr{ |
| 287 | IP: net.ParseIP(remoteAddr), |
| 288 | Port: req.requestRemotePort(), |
| 289 | }, |
| 290 | DestinationAddr: destAddr, |
| 291 | } |
| 292 | _, err := header.WriteTo(conn) |
| 293 | if err != nil { |
| 294 | _ = conn.Close() |
| 295 | return err |
| 296 | } |
| 297 | return nil |
| 298 | } |
| 299 | |
| 300 | return nil |
| 301 | } |
no test coverage detected