@@ -76,7 +76,7 @@ func ServeSetHeaders(w http.ResponseWriter, opts *ServeHeaderOptions) {
7676}
7777
7878// ServeData download file from io.Reader
79- func setServeHeadersByFile (r * http.Request , w http.ResponseWriter , filePath string , mineBuf []byte ) error {
79+ func setServeHeadersByFile (r * http.Request , w http.ResponseWriter , filePath string , mineBuf []byte ) {
8080 // do not set "Content-Length", because the length could only be set by callers, and it needs to support range requests
8181 opts := & ServeHeaderOptions {
8282 Filename : path .Base (filePath ),
@@ -129,23 +129,21 @@ func setServeHeadersByFile(r *http.Request, w http.ResponseWriter, filePath stri
129129 }
130130
131131 ServeSetHeaders (w , opts )
132- return nil
133132}
134133
135134const mimeDetectionBufferLen = 1024
136135
137- func ServeContentByReader (r * http.Request , w http.ResponseWriter , filePath string , size int64 , reader io.Reader ) error {
136+ func ServeContentByReader (r * http.Request , w http.ResponseWriter , filePath string , size int64 , reader io.Reader ) {
138137 buf := make ([]byte , mimeDetectionBufferLen )
139138 n , err := util .ReadAtMost (reader , buf )
140139 if err != nil {
141- return err
140+ http .Error (w , "serve content: unable to pre-read" , http .StatusRequestedRangeNotSatisfiable )
141+ return
142142 }
143143 if n >= 0 {
144144 buf = buf [:n ]
145145 }
146- if err = setServeHeadersByFile (r , w , filePath , buf ); err != nil {
147- return err
148- }
146+ setServeHeadersByFile (r , w , filePath , buf )
149147
150148 // reset the reader to the beginning
151149 reader = io .MultiReader (bytes .NewReader (buf ), reader )
@@ -157,8 +155,8 @@ func ServeContentByReader(r *http.Request, w http.ResponseWriter, filePath strin
157155 if size >= 0 {
158156 w .Header ().Set ("Content-Length" , strconv .FormatInt (size , 10 ))
159157 }
160- _ , err = io .Copy (w , reader )
161- return err
158+ _ , _ = io .Copy (w , reader ) // just like http.ServeContent, not necessary to handle the error
159+ return
162160 }
163161
164162 // do our best to support the minimal "Range" request (no support for multiple range: "Range: bytes=0-50, 100-150")
@@ -178,7 +176,7 @@ func ServeContentByReader(r *http.Request, w http.ResponseWriter, filePath strin
178176 }
179177 if err != nil {
180178 http .Error (w , err .Error (), http .StatusRequestedRangeNotSatisfiable )
181- return err
179+ return
182180 }
183181 end , err := strconv .ParseInt (rangeBytesEnd , 10 , 64 )
184182 if rangeBytesEnd == "" && found {
@@ -193,36 +191,35 @@ func ServeContentByReader(r *http.Request, w http.ResponseWriter, filePath strin
193191 }
194192 if err != nil {
195193 http .Error (w , err .Error (), http .StatusBadRequest )
196- return err
194+ return
197195 }
198196
199197 partialLength := end - start + 1
200198 w .Header ().Set ("Content-Range" , fmt .Sprintf ("bytes %d-%d/%d" , start , end , size ))
201199 w .Header ().Set ("Content-Length" , strconv .FormatInt (partialLength , 10 ))
202200 if _ , err = io .CopyN (io .Discard , reader , start ); err != nil {
203- return fmt .Errorf ("unable to skip first %d bytes: %w" , start , err )
201+ http .Error (w , "serve content: unable to skip" , http .StatusRequestedRangeNotSatisfiable )
202+ return
204203 }
205204
206205 w .WriteHeader (http .StatusPartialContent )
207- _ , err = io .CopyN (w , reader , partialLength )
208- return err
206+ _ , _ = io .CopyN (w , reader , partialLength ) // just like http.ServeContent, not necessary to handle the error
209207}
210208
211- func ServeContentByReadSeeker (r * http.Request , w http.ResponseWriter , filePath string , modTime time.Time , reader io.ReadSeeker ) error {
209+ func ServeContentByReadSeeker (r * http.Request , w http.ResponseWriter , filePath string , modTime time.Time , reader io.ReadSeeker ) {
212210 buf := make ([]byte , mimeDetectionBufferLen )
213211 n , err := util .ReadAtMost (reader , buf )
214212 if err != nil {
215- return err
213+ http .Error (w , "serve content: unable to read" , http .StatusInternalServerError )
214+ return
216215 }
217216 if _ , err = reader .Seek (0 , io .SeekStart ); err != nil {
218- return err
217+ http .Error (w , "serve content: unable to seek" , http .StatusInternalServerError )
218+ return
219219 }
220220 if n >= 0 {
221221 buf = buf [:n ]
222222 }
223- if err = setServeHeadersByFile (r , w , filePath , buf ); err != nil {
224- return err
225- }
223+ setServeHeadersByFile (r , w , filePath , buf )
226224 http .ServeContent (w , r , path .Base (filePath ), modTime , reader )
227- return nil
228225}
0 commit comments