developer747
developer747

Reputation: 15938

Is there a way to get all the open http connections on a host in go?

I have a go webserver. Is there a way where I can get all the open http connections on that host?

Upvotes: 1

Views: 1016

Answers (1)

Thundercat
Thundercat

Reputation: 120989

Create a type to record open connections in response to server connection state changes:

type ConnectionWatcher struct {
    // mu protects remaining fields
    mu sync.Mutex

    // open connections are keys in the map
    m  map[net.Conn]struct{}
}

// OnStateChange records open connections in response to connection
// state changes. Set net/http Server.ConnState to this method
// as value.
func (cw *ConnectionWatcher) OnStateChange(conn net.Conn, state http.ConnState) {
    switch state {
    case http.StateNew:
        cw.mu.Lock()
        if cw.m == nil {
            cw.m = make(map[net.Conn]struct{})
        }
        cw.m[conn] = struct{}{}
        cw.mu.Unlock()
    case http.StateHijacked, http.StateClosed:
        cw.mu.Lock()
        delete(cw.m, conn)
        cw.mu.Unlock()
    }
}

// Connections returns the open connections at the time
// the call. 
func (cw *ConnectionWatcher) Connections() []net.Conn {
    var result []net.Conn
    cw.mu.Lock()
    for conn := range cw.m {
        result = append(result, conn)
    }
    cw.mu.Unlock()
    return result
}

Configure the net.Server to use the method value:

var cw ConnectionWatcher
s := &http.Server{
   ConnState: cw.OnStateChange
}

Start the server using ListenAndServe, Serve or the TLS variants of these methods.

Depending on what the application is doing, you may want to lock ConnectionWatcher.mu while examining the connections.

Run it on the playground.

Upvotes: 5

Related Questions