Discourse는 HTTP Range 헤더 에 대한 지원을 누락하고 있으며, 파일 다운로드 시 206 Partial Content 대신 항상 200 OK 코드로 응답합니다. 이는 불안정한 인터넷 연결 상황에서 전체 파일을 다시 다운로드해야 하므로 포럼 사용자들에게 불편을 초래합니다.
Backup too big, is there a way to download it through "resume download" 토픽에서는 백업 다운로드 시 이 문제를 언급했지만, S3 스토리지가 사용되지 않는 경우에도 일반 파일 다운로드에 해당 문제가 적용됩니다.
nginx 프록시 구성을 확인해 보았으나, 이는 구성 문제가 아닙니다. /uploads/short-url/ 요청에 대해 Range 헤더가 localhost:3000으로 올바르게 전달되고 있지만, Discourse가 이를 처리하지 못하고 있습니다.
HTTP Range는 HTTP의 기본 기능 중 하나이므로, 이 문제를 "기능"이 아닌 “버그” 카테고리로 분류합니다.
P.S. meta.discourse.org에서는 재현할 수 없으며, 이는 S3를 스토리지로 사용하기 때문입니다.
2개의 좋아요
Falco
(Falco)
8월 9, 2022, 8:00오후
2
이 부분은 여기서 처리됩니다:
def send_file_local_upload(upload)
opts = {
filename: upload.original_filename,
content_type: MiniMime.lookup_by_filename(upload.original_filename)&.content_type
}
if !FileHelper.is_inline_image?(upload.original_filename)
opts[:disposition] = "attachment"
elsif params[:inline]
opts[:disposition] = "inline"
end
file_path = Discourse.store.path_for(upload)
return render_404 unless file_path
send_file(file_path, opts)
end
Range에 대한 지원을 추가하는 것은 분명히 가능하지만, send_data를 사용하고 디스크에서 파일을 읽은 후 해당 범위를 전송해야 합니다:
https://stackoverflow.com/a/57786143/702738
솔직히 말해서, 너무 복잡합니다.
1개의 좋아요