123456789101112131415161718192021222324252627282930313233343536 |
- package cproxy
- import (
- "fmt"
- "io"
- "net"
- "strings"
- )
- type proxyProtocolInitializer struct{}
- func newProxyProtocolInitializer() *proxyProtocolInitializer {
- return &proxyProtocolInitializer{}
- }
- func (this *proxyProtocolInitializer) Initialize(client, server Socket) bool {
- header := formatHeader(client.RemoteAddr(), server.RemoteAddr())
- _, err := io.WriteString(server, header)
- return err == nil
- }
- func formatHeader(client, server net.Addr) string {
- clientAddress, clientPort := parseAddress(client.String())
- serverAddress, serverPort := parseAddress(server.String())
- if strings.Contains(clientAddress, ":") {
- return fmt.Sprintf(proxyProtocolIPv6Preamble, clientAddress, serverAddress, clientPort, serverPort)
- }
- return fmt.Sprintf(proxyProtocolIPv4Preamble, clientAddress, serverAddress, clientPort, serverPort)
- }
- func parseAddress(address string) (string, string) {
- address, port, _ := net.SplitHostPort(address)
- return address, port
- }
- const proxyProtocolIPv4Preamble = "PROXY TCP4 %s %s %s %s\r\n"
- const proxyProtocolIPv6Preamble = "PROXY TCP6 %s %s %s %s\r\n"
|