Refactor: make inbound request contextual
This commit is contained in:
39
context/conn.go
Normal file
39
context/conn.go
Normal file
@ -0,0 +1,39 @@
|
||||
package context
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
C "github.com/Dreamacro/clash/constant"
|
||||
|
||||
"github.com/gofrs/uuid"
|
||||
)
|
||||
|
||||
type ConnContext struct {
|
||||
id uuid.UUID
|
||||
metadata *C.Metadata
|
||||
conn net.Conn
|
||||
}
|
||||
|
||||
func NewConnContext(conn net.Conn, metadata *C.Metadata) *ConnContext {
|
||||
id, _ := uuid.NewV4()
|
||||
return &ConnContext{
|
||||
id: id,
|
||||
metadata: metadata,
|
||||
conn: conn,
|
||||
}
|
||||
}
|
||||
|
||||
// ID implement C.ConnContext ID
|
||||
func (c *ConnContext) ID() uuid.UUID {
|
||||
return c.id
|
||||
}
|
||||
|
||||
// Metadata implement C.ConnContext Metadata
|
||||
func (c *ConnContext) Metadata() *C.Metadata {
|
||||
return c.metadata
|
||||
}
|
||||
|
||||
// Conn implement C.ConnContext Conn
|
||||
func (c *ConnContext) Conn() net.Conn {
|
||||
return c.conn
|
||||
}
|
41
context/dns.go
Normal file
41
context/dns.go
Normal file
@ -0,0 +1,41 @@
|
||||
package context
|
||||
|
||||
import (
|
||||
"github.com/gofrs/uuid"
|
||||
"github.com/miekg/dns"
|
||||
)
|
||||
|
||||
const (
|
||||
DNSTypeHost = "host"
|
||||
DNSTypeFakeIP = "fakeip"
|
||||
DNSTypeRaw = "raw"
|
||||
)
|
||||
|
||||
type DNSContext struct {
|
||||
id uuid.UUID
|
||||
msg *dns.Msg
|
||||
tp string
|
||||
}
|
||||
|
||||
func NewDNSContext(msg *dns.Msg) *DNSContext {
|
||||
id, _ := uuid.NewV4()
|
||||
return &DNSContext{
|
||||
id: id,
|
||||
msg: msg,
|
||||
}
|
||||
}
|
||||
|
||||
// ID implement C.PlainContext ID
|
||||
func (c *DNSContext) ID() uuid.UUID {
|
||||
return c.id
|
||||
}
|
||||
|
||||
// SetType set type of response
|
||||
func (c *DNSContext) SetType(tp string) {
|
||||
c.tp = tp
|
||||
}
|
||||
|
||||
// Type return type of response
|
||||
func (c *DNSContext) Type() string {
|
||||
return c.tp
|
||||
}
|
47
context/http.go
Normal file
47
context/http.go
Normal file
@ -0,0 +1,47 @@
|
||||
package context
|
||||
|
||||
import (
|
||||
"net"
|
||||
"net/http"
|
||||
|
||||
C "github.com/Dreamacro/clash/constant"
|
||||
|
||||
"github.com/gofrs/uuid"
|
||||
)
|
||||
|
||||
type HTTPContext struct {
|
||||
id uuid.UUID
|
||||
metadata *C.Metadata
|
||||
conn net.Conn
|
||||
req *http.Request
|
||||
}
|
||||
|
||||
func NewHTTPContext(conn net.Conn, req *http.Request, metadata *C.Metadata) *HTTPContext {
|
||||
id, _ := uuid.NewV4()
|
||||
return &HTTPContext{
|
||||
id: id,
|
||||
metadata: metadata,
|
||||
conn: conn,
|
||||
req: req,
|
||||
}
|
||||
}
|
||||
|
||||
// ID implement C.ConnContext ID
|
||||
func (hc *HTTPContext) ID() uuid.UUID {
|
||||
return hc.id
|
||||
}
|
||||
|
||||
// Metadata implement C.ConnContext Metadata
|
||||
func (hc *HTTPContext) Metadata() *C.Metadata {
|
||||
return hc.metadata
|
||||
}
|
||||
|
||||
// Conn implement C.ConnContext Conn
|
||||
func (hc *HTTPContext) Conn() net.Conn {
|
||||
return hc.conn
|
||||
}
|
||||
|
||||
// Request return the http request struct
|
||||
func (hc *HTTPContext) Request() *http.Request {
|
||||
return hc.req
|
||||
}
|
43
context/packetconn.go
Normal file
43
context/packetconn.go
Normal file
@ -0,0 +1,43 @@
|
||||
package context
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
C "github.com/Dreamacro/clash/constant"
|
||||
|
||||
"github.com/gofrs/uuid"
|
||||
)
|
||||
|
||||
type PacketConnContext struct {
|
||||
id uuid.UUID
|
||||
metadata *C.Metadata
|
||||
packetConn net.PacketConn
|
||||
}
|
||||
|
||||
func NewPacketConnContext(metadata *C.Metadata) *PacketConnContext {
|
||||
id, _ := uuid.NewV4()
|
||||
return &PacketConnContext{
|
||||
id: id,
|
||||
metadata: metadata,
|
||||
}
|
||||
}
|
||||
|
||||
// ID implement C.PacketConnContext ID
|
||||
func (pc *PacketConnContext) ID() uuid.UUID {
|
||||
return pc.id
|
||||
}
|
||||
|
||||
// Metadata implement C.PacketConnContext Metadata
|
||||
func (pc *PacketConnContext) Metadata() *C.Metadata {
|
||||
return pc.metadata
|
||||
}
|
||||
|
||||
// PacketConn implement C.PacketConnContext PacketConn
|
||||
func (pc *PacketConnContext) PacketConn() net.PacketConn {
|
||||
return pc.packetConn
|
||||
}
|
||||
|
||||
// InjectPacketConn injectPacketConn manually
|
||||
func (pc *PacketConnContext) InjectPacketConn(pconn C.PacketConn) {
|
||||
pc.packetConn = pconn
|
||||
}
|
Reference in New Issue
Block a user