set RemoteAddr in http request objects

fixes #266
This commit is contained in:
Lucas Clemente
2016-08-09 11:50:27 +02:00
parent d8f53d4cf7
commit 8c5a3dabd6
6 changed files with 20 additions and 7 deletions

View File

@@ -45,7 +45,7 @@ func (c *linkedConnection) write(p []byte) error {
}
func (*linkedConnection) setCurrentRemoteAddr(addr interface{}) {}
func (*linkedConnection) IP() net.IP { return nil }
func (*linkedConnection) RemoteAddr() *net.UDPAddr { return &net.UDPAddr{} }
func setAEAD(cs *handshake.CryptoSetup, aead crypto.AEAD) {
*(*bool)(unsafe.Pointer(reflect.ValueOf(cs).Elem().FieldByName("receivedForwardSecurePacket").UnsafeAddr())) = true

View File

@@ -22,6 +22,7 @@ import (
type streamCreator interface {
GetOrOpenStream(protocol.StreamID) (utils.Stream, error)
Close(error) error
RemoteAddr() *net.UDPAddr
}
// Server is a HTTP2 server listening for QUIC connections.
@@ -137,6 +138,8 @@ func (s *Server) handleRequest(session streamCreator, headerStream utils.Stream,
return err
}
req.RemoteAddr = session.RemoteAddr().String()
if utils.Debug() {
utils.Infof("%s %s%s, on data stream %d", req.Method, req.Host, req.RequestURI, h2headersFrame.StreamID)
} else {

View File

@@ -28,8 +28,10 @@ type mockSession struct {
func (s *mockSession) GetOrOpenStream(id protocol.StreamID) (utils.Stream, error) {
return s.dataStream, nil
}
func (s *mockSession) Close(error) error { s.closed = true; return nil }
func (s *mockSession) RemoteAddr() *net.UDPAddr {
return &net.UDPAddr{IP: []byte{127, 0, 0, 1}, Port: 42}
}
var _ = Describe("H2 server", func() {
certPath := os.Getenv("GOPATH")
@@ -67,7 +69,9 @@ var _ = Describe("H2 server", func() {
It("handles a sample GET request", func() {
var handlerCalled bool
s.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer GinkgoRecover()
Expect(r.Host).To(Equal("www.example.com"))
Expect(r.RemoteAddr).To(Equal("127.0.0.1:42"))
handlerCalled = true
})
headerStream.Write([]byte{

View File

@@ -3,6 +3,7 @@ package quic
import (
"errors"
"fmt"
"net"
"sync/atomic"
"time"
@@ -128,7 +129,7 @@ func newSession(conn connection, v protocol.VersionNumber, connectionID protocol
cryptoStream, _ := session.GetOrOpenStream(1)
var err error
session.cryptoSetup, err = handshake.NewCryptoSetup(connectionID, conn.IP(), v, sCfg, cryptoStream, session.connectionParametersManager, session.aeadChanged)
session.cryptoSetup, err = handshake.NewCryptoSetup(connectionID, conn.RemoteAddr().IP, v, sCfg, cryptoStream, session.connectionParametersManager, session.aeadChanged)
if err != nil {
return nil, err
}
@@ -652,3 +653,8 @@ func (s *Session) getWindowUpdateFrames() ([]*frames.WindowUpdateFrame, error) {
return res, nil
}
// RemoteAddr returns the net.UDPAddr of the client
func (s *Session) RemoteAddr() *net.UDPAddr {
return s.conn.RemoteAddr()
}

View File

@@ -35,7 +35,7 @@ func (m *mockConnection) write(p []byte) error {
}
func (*mockConnection) setCurrentRemoteAddr(addr interface{}) {}
func (*mockConnection) IP() net.IP { return nil }
func (*mockConnection) RemoteAddr() *net.UDPAddr { return &net.UDPAddr{} }
type mockUnpacker struct{}

View File

@@ -5,7 +5,7 @@ import "net"
type connection interface {
write([]byte) error
setCurrentRemoteAddr(interface{})
IP() net.IP
RemoteAddr() *net.UDPAddr
}
type udpConn struct {
@@ -24,6 +24,6 @@ func (c *udpConn) setCurrentRemoteAddr(addr interface{}) {
c.currentAddr = addr.(*net.UDPAddr)
}
func (c *udpConn) IP() net.IP {
return c.currentAddr.IP
func (c *udpConn) RemoteAddr() *net.UDPAddr {
return c.currentAddr
}