fix: support authenticated video citation playback

This commit is contained in:
key
2026-08-02 22:04:09 +08:00
parent 6ad8a017a4
commit a07bbcca07
7 changed files with 83 additions and 26 deletions
@@ -56,7 +56,9 @@ public class AihrKnowledgeResourceDownloadService {
}
response.setHeader("Cache-Control", "no-store");
response.setHeader("Referrer-Policy", "no-referrer");
ossService.download(ossId, response);
// Browsers may probe media without a Range header first. Keep that response
// inline and preserve the source MIME type so the video element can decode it.
ossService.downloadRange(ossId, null, response);
}
public void download(Long attachmentId, String ticket, String range, HttpServletResponse response) throws IOException {
@@ -10,12 +10,31 @@ import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@Tag("dev")
class AihrKnowledgeResourceRangeTest {
@Test
void streamsInitialMediaRequestInlineWithDetectedMimeType() throws Exception {
AihrKnowledgeQueryService query = mock(AihrKnowledgeQueryService.class);
ISysOssService oss = mock(ISysOssService.class);
RedissonClient redisson = mock(RedissonClient.class);
@SuppressWarnings("unchecked") RBucket<Long> bucket = mock(RBucket.class);
HttpServletResponse response = mock(HttpServletResponse.class);
when(redisson.<Long>getBucket(anyString())).thenReturn(bucket);
when(bucket.get()).thenReturn(777L);
String ticket = "a".repeat(43);
new AihrKnowledgeResourceDownloadService(query, oss, redisson)
.download(321L, ticket, response);
verify(oss).downloadRange(777L, null, response);
verify(oss, never()).download(777L, response);
}
@Test
void forwardsAuthorizedRangeWithoutBufferingWholeObject() throws Exception {
AihrKnowledgeQueryService query = mock(AihrKnowledgeQueryService.class);