http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { values := request.URL.Query() subLink := values.Get("sub") subLinkURL, _ := url.Parse(subLink) if subLink == "" { http.Error(writer, "param \"sub\" missing", http.StatusInternalServerError) return } res, err := http.Get(subLink) if err != nil { http.Error(writer, err.Error(), http.StatusInternalServerError) return } if res.StatusCode != 200 { http.Error(writer, "upstream server returns error", res.StatusCode) } var remote sub.ClashSub err = yaml.NewDecoder(res.Body).Decode(&remote) if err != nil { http.Error(writer, err.Error(), http.StatusInternalServerError) } var body = bytes.NewBuffer(nil)
// omitted...
// this goes before writer.Write, or the content has no effect for k, v := range res.Header { switch k { case"Subscription-Userinfo": writer.Header().Set(k, v[0]) case"Content-Disposition": if subLinkURL != nil { writer.Header().Set(k, "attachment;filename="+subLinkURL.Host) } } } fmt.Fprintf(writer, body.String()) log.Printf("fetch clash sub %s and transformed, requester: %s", subLink, request.RemoteAddr) })