TODO 增加失败重试
(key *pb.HTTPCacheTaskKey)
| 216 | |
| 217 | // TODO 增加失败重试 |
| 218 | func (this *HTTPCacheTaskManager) fetchKey(key *pb.HTTPCacheTaskKey) error { |
| 219 | var fullKey = key.Key |
| 220 | if !this.protocolReg.MatchString(fullKey) { |
| 221 | fullKey = "https://" + fullKey |
| 222 | } |
| 223 | |
| 224 | req, err := http.NewRequest(http.MethodGet, fullKey, nil) |
| 225 | if err != nil { |
| 226 | return fmt.Errorf("invalid url: '%s': %w", fullKey, err) |
| 227 | } |
| 228 | |
| 229 | // TODO 可以在管理界面自定义Header |
| 230 | req.Header.Set("X-Edge-Cache-Action", "fetch") |
| 231 | req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36") // TODO 可以定义 |
| 232 | req.Header.Set("Accept-Encoding", "gzip, deflate, br") |
| 233 | resp, err := this.httpClient().Do(req) |
| 234 | if err != nil { |
| 235 | err = this.simplifyErr(err) |
| 236 | return fmt.Errorf("request failed: '%s': %w", fullKey, err) |
| 237 | } |
| 238 | |
| 239 | defer func() { |
| 240 | _ = resp.Body.Close() |
| 241 | }() |
| 242 | |
| 243 | // 处理502 |
| 244 | if resp.StatusCode == http.StatusBadGateway { |
| 245 | return errors.New("read origin site timeout") |
| 246 | } |
| 247 | |
| 248 | // 读取内容,以便于生成缓存 |
| 249 | var buf = utils.BytePool16k.Get() |
| 250 | _, err = io.CopyBuffer(io.Discard, resp.Body, buf.Bytes) |
| 251 | utils.BytePool16k.Put(buf) |
| 252 | if err != nil { |
| 253 | if err != io.EOF { |
| 254 | err = this.simplifyErr(err) |
| 255 | return fmt.Errorf("request failed: '%s': %w", fullKey, err) |
| 256 | } else { |
| 257 | err = nil |
| 258 | } |
| 259 | } |
| 260 | |
| 261 | return nil |
| 262 | } |
| 263 | |
| 264 | func (this *HTTPCacheTaskManager) simplifyErr(err error) error { |
| 265 | if err == nil { |
no test coverage detected