Move ResponseWriter Conn and TLS methods to Request

This commit is contained in:
Adnan Maolood 2021-02-24 08:24:47 -05:00
parent b488146cc6
commit de339490f4
3 changed files with 19 additions and 21 deletions

View File

@ -4,6 +4,7 @@ import (
"bufio" "bufio"
"crypto/tls" "crypto/tls"
"io" "io"
"net"
"net/url" "net/url"
) )
@ -26,6 +27,8 @@ type Request struct {
// TLS certificate to present to the other side of the connection. // TLS certificate to present to the other side of the connection.
// This field is ignored by the Gemini server. // This field is ignored by the Gemini server.
Certificate *tls.Certificate Certificate *tls.Certificate
conn net.Conn
} }
// NewRequest returns a new request. // NewRequest returns a new request.
@ -89,3 +92,18 @@ func (r *Request) Write(w io.Writer) error {
} }
return bw.Flush() return bw.Flush()
} }
// Conn returns the network connection on which the request was received.
func (r *Request) Conn() net.Conn {
return r.conn
}
// TLS returns information about the TLS connection on which the
// request was received.
func (r *Request) TLS() *tls.ConnectionState {
if tlsConn, ok := r.conn.(*tls.Conn); ok {
state := tlsConn.ConnectionState()
return &state
}
return nil
}

View File

@ -156,13 +156,6 @@ type ResponseWriter interface {
// Any blocked Write operations will be unblocked and return errors. // Any blocked Write operations will be unblocked and return errors.
Close() error Close() error
// Conn returns the underlying network connection.
// To take over the connection, use Hijack.
Conn() net.Conn
// TLS returns information about the underlying TLS connection.
TLS() *tls.ConnectionState
// unexported method so we can extend this interface over time // unexported method so we can extend this interface over time
// without breaking existing code. Implementers must embed a concrete // without breaking existing code. Implementers must embed a concrete
// type from elsewhere. // type from elsewhere.
@ -175,7 +168,6 @@ type responseWriter struct {
mediatype string mediatype string
wroteHeader bool wroteHeader bool
bodyAllowed bool bodyAllowed bool
conn net.Conn
} }
func newResponseWriter(w io.WriteCloser) *responseWriter { func newResponseWriter(w io.WriteCloser) *responseWriter {
@ -232,16 +224,4 @@ func (w *responseWriter) Close() error {
return w.cl.Close() return w.cl.Close()
} }
func (w *responseWriter) Conn() net.Conn {
return w.conn
}
func (w *responseWriter) TLS() *tls.ConnectionState {
if tlsConn, ok := w.conn.(*tls.Conn); ok {
state := tlsConn.ConnectionState()
return &state
}
return nil
}
func (w *responseWriter) unexported() {} func (w *responseWriter) unexported() {}

View File

@ -360,13 +360,13 @@ func (srv *Server) serveConn(ctx context.Context, conn net.Conn) error {
} }
w := newResponseWriter(cw) w := newResponseWriter(cw)
w.conn = conn
req, err := ReadRequest(r) req, err := ReadRequest(r)
if err != nil { if err != nil {
w.WriteHeader(StatusBadRequest, "Bad request") w.WriteHeader(StatusBadRequest, "Bad request")
return w.Flush() return w.Flush()
} }
req.conn = conn
h := srv.Handler h := srv.Handler
if h == nil { if h == nil {