How to Access the Underlying Socket of a net/http Response in Go?

Linda Hamilton
Release: 2024-11-06 16:15:02
Original
445 people have browsed it

How to Access the Underlying Socket of a net/http Response in Go?

Accessing the Underlying Socket of a net/http Response in Go

Introduction

While developing a web application using Go's net/http package, it might be necessary to access the underlying socket associated with an HTTP response. This allows for the execution of additional platform-specific operations on the socket, such as TCP_INFO system calls.

Solutions

Using Request Context (Go 1.13 and later)

In Go 1.13 and later, the net.Conn object can be stored in the Request Context, enabling easy access within the handler function.

<code class="go">func GetConn(r *http.Request) (net.Conn) {
  return r.Context().Value(ConnContextKey).(net.Conn)
}</code>
Copy after login

Using RemoteAddr and Connections Map (Pre-Go 1.13)

For servers listening on TCP ports, a unique key can be generated from the RemoteAddr of each connection using a global map.

<code class="go">func GetConn(r *http.Request) (net.Conn) {
  return conns[r.RemoteAddr]
}</code>
Copy after login

Overriding RemoteAddr for UNIX Socket

For servers listening on UNIX sockets, the RemoteAddr is always "@", making the previous approach ineffective. To resolve this, override net.Listener.Accept() and redefine the RemoteAddr() method.

<code class="go">type remoteAddrPtrConn struct {
  net.Conn
  ptrStr string
}
func (self remoteAddrPtrConn) RemoteAddr() (net.Addr) {
  return remoteAddrPtr{self.ptrStr}
}</code>
Copy after login

Additional Notes

  • The Hijack() method allows complete control over the raw TCP socket, but it is a more invasive approach.
  • The ConnStateEvent callback can be used to track the state of connections and update the connection map accordingly.

The above is the detailed content of How to Access the Underlying Socket of a net/http Response in Go?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!