@@ -76,7 +76,7 @@ func ServeSetHeaders(w http.ResponseWriter, opts *ServeHeaderOptions) {
76
76
}
77
77
78
78
// 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 ) {
80
80
// do not set "Content-Length", because the length could only be set by callers, and it needs to support range requests
81
81
opts := & ServeHeaderOptions {
82
82
Filename : path .Base (filePath ),
@@ -129,23 +129,21 @@ func setServeHeadersByFile(r *http.Request, w http.ResponseWriter, filePath stri
129
129
}
130
130
131
131
ServeSetHeaders (w , opts )
132
- return nil
133
132
}
134
133
135
134
const mimeDetectionBufferLen = 1024
136
135
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 ) {
138
137
buf := make ([]byte , mimeDetectionBufferLen )
139
138
n , err := util .ReadAtMost (reader , buf )
140
139
if err != nil {
141
- return err
140
+ http .Error (w , "serve content: unable to pre-read" , http .StatusRequestedRangeNotSatisfiable )
141
+ return
142
142
}
143
143
if n >= 0 {
144
144
buf = buf [:n ]
145
145
}
146
- if err = setServeHeadersByFile (r , w , filePath , buf ); err != nil {
147
- return err
148
- }
146
+ setServeHeadersByFile (r , w , filePath , buf )
149
147
150
148
// reset the reader to the beginning
151
149
reader = io .MultiReader (bytes .NewReader (buf ), reader )
@@ -157,8 +155,8 @@ func ServeContentByReader(r *http.Request, w http.ResponseWriter, filePath strin
157
155
if size >= 0 {
158
156
w .Header ().Set ("Content-Length" , strconv .FormatInt (size , 10 ))
159
157
}
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
162
160
}
163
161
164
162
// 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
178
176
}
179
177
if err != nil {
180
178
http .Error (w , err .Error (), http .StatusRequestedRangeNotSatisfiable )
181
- return err
179
+ return
182
180
}
183
181
end , err := strconv .ParseInt (rangeBytesEnd , 10 , 64 )
184
182
if rangeBytesEnd == "" && found {
@@ -193,36 +191,35 @@ func ServeContentByReader(r *http.Request, w http.ResponseWriter, filePath strin
193
191
}
194
192
if err != nil {
195
193
http .Error (w , err .Error (), http .StatusBadRequest )
196
- return err
194
+ return
197
195
}
198
196
199
197
partialLength := end - start + 1
200
198
w .Header ().Set ("Content-Range" , fmt .Sprintf ("bytes %d-%d/%d" , start , end , size ))
201
199
w .Header ().Set ("Content-Length" , strconv .FormatInt (partialLength , 10 ))
202
200
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
204
203
}
205
204
206
205
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
209
207
}
210
208
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 ) {
212
210
buf := make ([]byte , mimeDetectionBufferLen )
213
211
n , err := util .ReadAtMost (reader , buf )
214
212
if err != nil {
215
- return err
213
+ http .Error (w , "serve content: unable to read" , http .StatusInternalServerError )
214
+ return
216
215
}
217
216
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
219
219
}
220
220
if n >= 0 {
221
221
buf = buf [:n ]
222
222
}
223
- if err = setServeHeadersByFile (r , w , filePath , buf ); err != nil {
224
- return err
225
- }
223
+ setServeHeadersByFile (r , w , filePath , buf )
226
224
http .ServeContent (w , r , path .Base (filePath ), modTime , reader )
227
- return nil
228
225
}
0 commit comments