Live-TV: die Adresse der Sendung wird genau einmal kodiert
Die nackte „400 Bad Request"-Seite war keine Plex-Meldung, sondern der Webserver: er hat die Anfrage selbst nicht verstanden. Grund war mein eigener Fix von vorhin — ich habe `%3A%2F%2F` entpackt, und damit stand `plex://episode/…` im Klartext in der Anfrage. Beide naheliegenden Wege liegen daneben, und ich habe beide durchgemacht: unverändert durchgereicht kodiert URLComponents ein zweites Mal, aus %3A wird %253A. Vorher entpackt bricht sich der Server die Adresse. Richtig ist genau einmal — dafür wird `path` von Hand eingesetzt, nachdem alles andere kodiert ist. Dazu aus der Spur gelernt: jede Form von /livetv/sessions/… antwortet auf diesem Server mit 404. Den Tuner belegt er offenbar selbst, sobald die Sendung umgerechnet werden soll. Deshalb steht die Adresse der Sendung jetzt an erster Stelle, und die Sitzungen kommen nur noch dahinter. Als dritte Form ein Versuch ohne das Geräteprofil: dessen Angaben stecken voller `&` und `=`, die in einem Abfragewert mehrdeutig sind. Trägt es ohne, liegt es daran, und das steht dann in der Spur. Ebenso, was der Programmanbieter überhaupt an Endpunkten angibt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
a9a45e685d
commit
1803dd670f
@@ -150,18 +150,24 @@ struct LiveTVGuideTests {
|
||||
#expect(lookup.trace.contains { $0.path == "/livetv/dvrs/2/channels" && $0.result.contains("Channel: 2") })
|
||||
}
|
||||
|
||||
@Test("Eine Adresse beim Programmanbieter wird nicht doppelt kodiert")
|
||||
func doesNotDoubleEncode() throws {
|
||||
// Derselbe Fehler wie einst beim Anmelde-Link: `URLComponents` kodiert
|
||||
// ein zweites Mal, aus %3A wird %253A, und der Server findet nichts.
|
||||
let request = TranscodeRequest(
|
||||
@Test("Die Adresse der Sendung wird genau einmal kodiert")
|
||||
func encodesPathExactlyOnce() async throws {
|
||||
// Beide naheliegenden Wege liegen daneben, und beide habe ich
|
||||
// durchgemacht: unverändert durchgereicht kodiert `URLComponents` ein
|
||||
// zweites Mal (%3A wird %253A); vorher entpackt steht `plex://…` im
|
||||
// Klartext in der Anfrage, und daran verschluckt sich der Server mit
|
||||
// einer nackten „400 Bad Request"-Seite.
|
||||
let server = server(routes: [:])
|
||||
let url = try #require(await server.transcodeURL(for: TranscodeRequest(
|
||||
ratingKey: "5",
|
||||
isLocal: true,
|
||||
pathOverride: "/tv.plex.providers.epg.cloud:2/metadata/plex%3A%2F%2Fmovie%2Fabc"
|
||||
)
|
||||
let path = try #require(request.queryItems.first { $0.name == "path" }?.value)
|
||||
)))
|
||||
let text = url.absoluteString
|
||||
|
||||
#expect(path == "/tv.plex.providers.epg.cloud:2/metadata/plex://movie/abc")
|
||||
#expect(text.contains("path=/tv.plex.providers.epg.cloud:2/metadata/plex%3A%2F%2Fmovie%2Fabc"))
|
||||
#expect(!text.contains("%253A"))
|
||||
#expect(!text.contains("plex://"))
|
||||
}
|
||||
|
||||
@Test("Nur was tatsächlich mit 200 antwortet, geht an den Player")
|
||||
@@ -227,7 +233,8 @@ struct LiveTVGuideTests {
|
||||
let keys = PlexServer.sessionKeys(channel: channel, program: program)
|
||||
|
||||
#expect(keys.first == "gk-5")
|
||||
// An `/livetv/sessions/<uuid>/` gehört ein Schlüssel, kein zweiter Pfad.
|
||||
// An `/livetv/sessions/<uuid>/` gehört ein Schlüssel, kein zweiter
|
||||
// Pfad — auch nicht nach dem Entpacken.
|
||||
#expect(keys.allSatisfy { !$0.contains("/") })
|
||||
#expect(keys.contains("5"))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user