@@ -131,50 +131,40 @@ func (s *service) doResponse(ctx *gin.Context, url string) {
131131 if shared .Setting .MultipleStream {
132132 ctx .Header ("X-Transfer-Type" , "multi_stream" )
133133
134- opts := []multistreamer.OptionFunc {
135- multistreamer .WithHeader (ctx .Request .Header ),
136- multistreamer .WithContext (ctx ),
137- }
138-
139- httpCode := http .StatusOK
134+ httpReq := ctx .Request .Header .Clone ()
135+ httpReq .Set ("Accept-Encoding" , "identity" )
136+ httpReq .Del ("Content-Type" )
140137
141- rangeSpec , yes , err := multistreamer .ParseRangeHeader (ctx . Request . Header . Get ( "Range" ))
138+ streamer , err := multistreamer .NewStreamer (ctx , url , httpReq , multistreamer . WithLogger ( s . logger ))
142139 if err != nil {
140+ s .logger .Error ("初始化失败" , zap .Error (err ), zap .String ("url" , url ))
141+
143142 ctx .JSON (http .StatusInternalServerError , gin.H {
144143 "code" : http .StatusInternalServerError ,
145- "message" : fmt .Sprintf ("解析Range失败 : %v" , err ),
144+ "message" : fmt .Sprintf ("初始化失败 : %v" , err ),
146145 })
146+
147147 return
148- } else if yes {
149- opts = append (opts , multistreamer .WithRange (rangeSpec .Start , rangeSpec .End ))
150- httpCode = http .StatusPartialContent
151148 }
152149
153- mt := multistreamer .New (url , ctx .Writer , opts ... )
154-
155- if err = mt .Init (); err != nil {
156- ctx .JSON (http .StatusInternalServerError , gin.H {
157- "code" : http .StatusInternalServerError ,
158- "message" : fmt .Sprintf ("启动失败: %v" , err ),
159- })
160- return
150+ for k , v := range streamer .GetResponseHeader () {
151+ ctx .Header (k , v [0 ])
161152 }
162153
163- if header , err := mt .GetResponseHeader (); err != nil {
164- ctx .JSON (http .StatusInternalServerError , gin.H {
165- "code" : http .StatusInternalServerError ,
166- "message" : fmt .Sprintf ("获取响应头失败: %v" , err ),
167- })
168- return
169- } else {
170- for k , v := range header {
171- ctx .Header (k , v [0 ])
154+ ctx .Status (streamer .HTTPCode ())
155+
156+ if err = streamer .Transfer (ctx , ctx .Writer ); err != nil {
157+ if s .isConnectionError (err ) {
158+ s .logger .Info ("客户端连接断开" ,
159+ zap .String ("url" , url ),
160+ )
161+ } else {
162+ s .logger .Error ("文件下载转发失败" ,
163+ zap .Error (err ),
164+ zap .String ("url" , url ),
165+ )
172166 }
173167 }
174-
175- ctx .Status (httpCode )
176- _ = mt .Execute ()
177-
178168 } else if shared .Setting .LocalProxy {
179169 s .handleLocalProxy (ctx , url )
180170 } else {
0 commit comments