mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2025-10-05 16:26:50 +08:00
68 lines
1.2 KiB
Go
68 lines
1.2 KiB
Go
package homekit
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"net"
|
|
"net/http"
|
|
|
|
"github.com/AlexxIT/go2rtc/pkg/hap"
|
|
)
|
|
|
|
func ProxyHandler(pair ServerPair, dial func() (net.Conn, error)) hap.HandlerFunc {
|
|
return func(controller net.Conn) error {
|
|
accessory, err := dial()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// accessory (ex. Camera) => controller (ex. iPhone)
|
|
go proxy(accessory, controller, nil)
|
|
|
|
// controller => accessory
|
|
return proxy(controller, accessory, pair)
|
|
}
|
|
}
|
|
|
|
func proxy(r, w net.Conn, pair ServerPair) error {
|
|
b := make([]byte, 64*1024)
|
|
for {
|
|
n, err := r.Read(b)
|
|
if err != nil {
|
|
break
|
|
}
|
|
|
|
if pair != nil && bytes.HasPrefix(b[:n], []byte("POST /pairings HTTP/1.1")) {
|
|
buf := bytes.NewBuffer(b[:n])
|
|
req, err := http.ReadRequest(bufio.NewReader(buf))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
res, err := handlePairings(r, req, pair)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
buf.Reset()
|
|
|
|
if err = res.Write(buf); err != nil {
|
|
return err
|
|
}
|
|
if _, err = buf.WriteTo(r); err != nil {
|
|
return err
|
|
}
|
|
continue
|
|
}
|
|
|
|
//log.Printf("[hap] %d bytes => %s\n%.512s", n, w.RemoteAddr(), b[:n])
|
|
|
|
if _, err = w.Write(b[:n]); err != nil {
|
|
break
|
|
}
|
|
}
|
|
_ = r.Close()
|
|
_ = w.Close()
|
|
return nil
|
|
}
|