fix(grok): proxy signed video status URLs

This commit is contained in:
Heatherm Huang
2026-07-18 17:21:53 +08:00
parent 1ed9f59599
commit f2e7a55703
2 changed files with 35 additions and 1 deletions
+25 -1
View File
@@ -845,7 +845,11 @@ func rewriteGrokMediaVideoContentURLs(body []byte, requestID, proxyURL string) [
if err := decoder.Decode(&value); err != nil {
return body
}
if !rewriteGrokMediaVideoContentURLValue(&value, requestID, proxyURL) {
changed := rewriteGrokMediaKnownVideoURL(&value, proxyURL)
if rewriteGrokMediaVideoContentURLValue(&value, requestID, proxyURL) {
changed = true
}
if !changed {
return body
}
rewritten, err := json.Marshal(value)
@@ -855,6 +859,26 @@ func rewriteGrokMediaVideoContentURLs(body []byte, requestID, proxyURL string) [
return rewritten
}
func rewriteGrokMediaKnownVideoURL(value *any, proxyURL string) bool {
if value == nil {
return false
}
root, ok := (*value).(map[string]any)
if !ok {
return false
}
video, ok := root["video"].(map[string]any)
if !ok {
return false
}
rawURL, ok := video["url"].(string)
if !ok || strings.TrimSpace(rawURL) == "" {
return false
}
video["url"] = proxyURL
return true
}
func rewriteGrokMediaVideoContentURLValue(value *any, requestID, proxyURL string) bool {
if value == nil {
return false
@@ -193,3 +193,13 @@ func TestRewriteGrokMediaVideoContentURLsPreservesOtherIDsAndHandlesNestedEscape
require.Equal(t, "/v1/videos/task%2Fone/content", gjson.GetBytes(rewritten, "nested.0.url").String())
require.Equal(t, "https://relay.example/v1/videos/task-two/content", gjson.GetBytes(rewritten, "nested.1.url").String())
}
func TestRewriteGrokMediaVideoContentURLsRewritesSignedVideoURL(t *testing.T) {
body := []byte(`{"status":"done","video":{"url":"https://vidgen.x.ai/signed-token/xai-video-request-1.mp4","duration":8}}`)
rewritten := rewriteGrokMediaVideoContentURLs(body, "request-1", "/v1/videos/request-1/content")
require.Equal(t, "/v1/videos/request-1/content", gjson.GetBytes(rewritten, "video.url").String())
require.Equal(t, "8", gjson.GetBytes(rewritten, "video.duration").String())
require.Equal(t, "done", gjson.GetBytes(rewritten, "status").String())
}