v0.314.0: the R-1060 web test (a fake Plex that refuses the name „plex”), left out of 17863fe
gates / gates (push) Successful in 47s
gates / gates (push) Successful in 47s
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
@@ -0,0 +1,67 @@
|
|||||||
|
package web
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"gitea.dooplex.hu/admin/felhom-controller/internal/mediawire"
|
||||||
|
)
|
||||||
|
|
||||||
|
// fakePlex answers as Plex does (measured on demo-hp 9201, 2026-10-15): a Host that is not an address is „non-local",
|
||||||
|
// so the claim gets 401; by address the claim is taken (200 here — the real one asks plex.tv). The test client dials
|
||||||
|
// this server whatever the URL names, so the only difference between the two calls is the Host header.
|
||||||
|
func fakePlex(t *testing.T) (hosts *[]string) {
|
||||||
|
t.Helper()
|
||||||
|
var seen []string
|
||||||
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
seen = append(seen, r.Host)
|
||||||
|
h, _, err := net.SplitHostPort(r.Host)
|
||||||
|
if err != nil {
|
||||||
|
h = r.Host
|
||||||
|
}
|
||||||
|
local := net.ParseIP(h) != nil
|
||||||
|
switch r.URL.Path {
|
||||||
|
case "/myplex/claim":
|
||||||
|
if !local {
|
||||||
|
w.WriteHeader(http.StatusUnauthorized)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
case "/identity":
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
_, _ = w.Write([]byte(`{"MediaContainer":{"claimed":` + map[bool]string{true: "true", false: "false"}[local] + `}}`))
|
||||||
|
default:
|
||||||
|
w.WriteHeader(http.StatusNotFound)
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
t.Cleanup(srv.Close)
|
||||||
|
oldHTTP, oldLookup := plexHTTP, mediawire.PlexLookup
|
||||||
|
plexHTTP = &http.Client{Transport: &http.Transport{DialContext: func(ctx context.Context, network, _ string) (net.Conn, error) {
|
||||||
|
return (&net.Dialer{}).DialContext(ctx, network, srv.Listener.Addr().String())
|
||||||
|
}}}
|
||||||
|
mediawire.PlexLookup = func(context.Context) ([]net.IPAddr, error) { return []net.IPAddr{{IP: net.ParseIP("10.9.8.7")}}, nil }
|
||||||
|
t.Cleanup(func() { plexHTTP, mediawire.PlexLookup = oldHTTP, oldLookup })
|
||||||
|
return &seen
|
||||||
|
}
|
||||||
|
|
||||||
|
// R-1060 — the household's claim reaches Plex BY ADDRESS, so Plex takes it as local; the identity call too.
|
||||||
|
// COMPANION RED-PROOF: make mediawire.PlexURL return "http://plex:<port>" (today's call) → 401 and this fails.
|
||||||
|
func TestR1060_TheClaimReachesPlexByAddress(t *testing.T) {
|
||||||
|
hosts := fakePlex(t)
|
||||||
|
code, err := plexClaim("claim-felhomtestcode0000")
|
||||||
|
if err != nil || code != http.StatusOK {
|
||||||
|
t.Fatalf("claim → %d (%v); Plex refuses the name „plex” as non-local — the box must call it by address", code, err)
|
||||||
|
}
|
||||||
|
if !plexClaimed() {
|
||||||
|
t.Fatal("the identity call did not reach Plex as local")
|
||||||
|
}
|
||||||
|
for _, h := range *hosts {
|
||||||
|
if !strings.HasPrefix(h, "10.9.8.7:") {
|
||||||
|
t.Errorf("a call to Plex carried Host %q, not its address", h)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user