@@ -33,7 +33,6 @@ import (
33
33
"sync"
34
34
"unicode"
35
35
36
- "github.com/google/uuid"
37
36
"github.com/matrix-org/dendrite/mediaapi/fileutils"
38
37
"github.com/matrix-org/dendrite/mediaapi/storage"
39
38
"github.com/matrix-org/dendrite/mediaapi/thumbnailer"
@@ -400,22 +399,16 @@ func (r *downloadRequest) respondFromLocalFile(
400
399
}
401
400
402
401
func multipartResponse (w http.ResponseWriter , r * downloadRequest , contentType string , responseFile io.Reader ) (int64 , error ) {
402
+ mw := multipart .NewWriter (w )
403
403
// Update the header to be multipart/mixed; boundary=$randomBoundary
404
- boundary := uuid .NewString ()
405
- w .Header ().Set ("Content-Type" , "multipart/mixed; boundary=" + boundary )
406
-
404
+ w .Header ().Set ("Content-Type" , "multipart/mixed; boundary=" + mw .Boundary ())
407
405
w .Header ().Del ("Content-Length" ) // let Go handle the content length
408
- mw := multipart .NewWriter (w )
409
406
defer func () {
410
407
if err := mw .Close (); err != nil {
411
408
r .Logger .WithError (err ).Error ("Failed to close multipart writer" )
412
409
}
413
410
}()
414
411
415
- if err := mw .SetBoundary (boundary ); err != nil {
416
- return 0 , fmt .Errorf ("failed to set multipart boundary: %w" , err )
417
- }
418
-
419
412
// JSON object part
420
413
jsonWriter , err := mw .CreatePart (textproto.MIMEHeader {
421
414
"Content-Type" : {"application/json" },
@@ -858,7 +851,7 @@ func (r *downloadRequest) fetchRemoteFile(
858
851
var reader io.Reader
859
852
var parseErr error
860
853
if isAuthed {
861
- parseErr , contentLength , reader = parseMultipartResponse (r , resp , maxFileSizeBytes )
854
+ contentLength , reader , parseErr = parseMultipartResponse (r , resp , maxFileSizeBytes )
862
855
} else {
863
856
// The reader returned here will be limited either by the Content-Length
864
857
// and/or the configured maximum media size.
@@ -928,48 +921,48 @@ func (r *downloadRequest) fetchRemoteFile(
928
921
return types .Path (finalPath ), duplicate , nil
929
922
}
930
923
931
- func parseMultipartResponse (r * downloadRequest , resp * http.Response , maxFileSizeBytes config.FileSizeBytes ) (error , int64 , io.Reader ) {
924
+ func parseMultipartResponse (r * downloadRequest , resp * http.Response , maxFileSizeBytes config.FileSizeBytes ) (int64 , io.Reader , error ) {
932
925
_ , params , err := mime .ParseMediaType (resp .Header .Get ("Content-Type" ))
933
926
if err != nil {
934
- return err , 0 , nil
927
+ return 0 , nil , err
935
928
}
936
929
if params ["boundary" ] == "" {
937
- return fmt .Errorf ("no boundary header found on media %s from %s" , r .MediaMetadata .MediaID , r .MediaMetadata .Origin ), 0 , nil
930
+ return 0 , nil , fmt .Errorf ("no boundary header found on media %s from %s" , r .MediaMetadata .MediaID , r .MediaMetadata .Origin )
938
931
}
939
932
mr := multipart .NewReader (resp .Body , params ["boundary" ])
940
933
941
934
// Get the first, JSON, part
942
935
p , err := mr .NextPart ()
943
936
if err != nil {
944
- return err , 0 , nil
937
+ return 0 , nil , err
945
938
}
946
939
defer p .Close () // nolint: errcheck
947
940
948
941
if p .Header .Get ("Content-Type" ) != "application/json" {
949
- return fmt .Errorf ("first part of the response must be application/json" ), 0 , nil
942
+ return 0 , nil , fmt .Errorf ("first part of the response must be application/json" )
950
943
}
951
944
// Try to parse media meta information
952
945
meta := mediaMeta {}
953
946
if err = json .NewDecoder (p ).Decode (& meta ); err != nil {
954
- return err , 0 , nil
947
+ return 0 , nil , err
955
948
}
956
949
defer p .Close () // nolint: errcheck
957
950
958
951
// Get the actual media content
959
952
p , err = mr .NextPart ()
960
953
if err != nil {
961
- return err , 0 , nil
954
+ return 0 , nil , err
962
955
}
963
956
964
957
redirect := p .Header .Get ("Location" )
965
958
if redirect != "" {
966
- return fmt .Errorf ("Location header is not yet supported" ), 0 , nil
959
+ return 0 , nil , fmt .Errorf ("Location header is not yet supported" )
967
960
}
968
961
969
962
contentLength , reader , err := r .GetContentLengthAndReader (p .Header .Get ("Content-Length" ), p , maxFileSizeBytes )
970
963
// For multipart requests, we need to get the Content-Type of the second part, which is the actual media
971
964
r .MediaMetadata .ContentType = types .ContentType (p .Header .Get ("Content-Type" ))
972
- return err , contentLength , reader
965
+ return contentLength , reader , err
973
966
}
974
967
975
968
// contentDispositionFor returns the Content-Disposition for a given
0 commit comments