Improved limited HomeKit server support for open source projects
This commit is contained in:
+29
-25
@@ -118,8 +118,8 @@ func Init() {
|
|||||||
servers[host] = srv
|
servers[host] = srv
|
||||||
}
|
}
|
||||||
|
|
||||||
api.HandleFunc(hap.PathPairSetup, hapPairSetup)
|
api.HandleFunc(hap.PathPairSetup, hapHandler)
|
||||||
api.HandleFunc(hap.PathPairVerify, hapPairVerify)
|
api.HandleFunc(hap.PathPairVerify, hapHandler)
|
||||||
|
|
||||||
log.Trace().Msgf("[homekit] mdns: %s", entries)
|
log.Trace().Msgf("[homekit] mdns: %s", entries)
|
||||||
|
|
||||||
@@ -148,32 +148,19 @@ func streamHandler(rawURL string) (core.Producer, error) {
|
|||||||
return client, err
|
return client, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func hapPairSetup(w http.ResponseWriter, r *http.Request) {
|
func resolve(host string) *server {
|
||||||
srv, ok := servers[r.Host]
|
if len(servers) == 1 {
|
||||||
if !ok {
|
for _, srv := range servers {
|
||||||
log.Error().Msg("[homekit] unknown host: " + r.Host)
|
return srv
|
||||||
return
|
}
|
||||||
}
|
}
|
||||||
|
if srv, ok := servers[host]; ok {
|
||||||
conn, rw, err := w.(http.Hijacker).Hijack()
|
return srv
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
defer conn.Close()
|
|
||||||
|
|
||||||
if err = srv.hap.PairSetup(r, rw, conn); err != nil {
|
|
||||||
log.Error().Err(err).Caller().Send()
|
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func hapPairVerify(w http.ResponseWriter, r *http.Request) {
|
func hapHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
srv, ok := servers[r.Host]
|
|
||||||
if !ok {
|
|
||||||
log.Error().Msg("[homekit] unknown host: " + r.Host)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
conn, rw, err := w.(http.Hijacker).Hijack()
|
conn, rw, err := w.(http.Hijacker).Hijack()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@@ -181,7 +168,24 @@ func hapPairVerify(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
if err = srv.hap.PairVerify(r, rw, conn); err != nil && err != io.EOF {
|
// Can support multiple HomeKit cameras on single port ONLY for Apple devices.
|
||||||
|
// Doesn't support Home Assistant and any other open source projects
|
||||||
|
// because they don't send the host header in requests.
|
||||||
|
srv := resolve(r.Host)
|
||||||
|
if srv == nil {
|
||||||
|
log.Error().Msg("[homekit] unknown host: " + r.Host)
|
||||||
|
_ = hap.WriteBackoff(rw)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
switch r.RequestURI {
|
||||||
|
case hap.PathPairSetup:
|
||||||
|
err = srv.hap.PairSetup(r, rw, conn)
|
||||||
|
case hap.PathPairVerify:
|
||||||
|
err = srv.hap.PairVerify(r, rw, conn)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil && err != io.EOF {
|
||||||
log.Error().Err(err).Caller().Send()
|
log.Error().Err(err).Caller().Send()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -235,3 +235,18 @@ func WriteResponse(w *bufio.Writer, statusCode int, contentType string, body []b
|
|||||||
}
|
}
|
||||||
return w.Flush()
|
return w.Flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func WriteBackoff(rw *bufio.ReadWriter) error {
|
||||||
|
plainM2 := struct {
|
||||||
|
State byte `tlv8:"6"`
|
||||||
|
Error byte `tlv8:"7"`
|
||||||
|
}{
|
||||||
|
State: StateM2,
|
||||||
|
Error: 3, // BackoffError
|
||||||
|
}
|
||||||
|
body, err := tlv8.Marshal(plainM2)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return WriteResponse(rw.Writer, http.StatusOK, MimeTLV8, body)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user