main.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "io"
  6. "log"
  7. "net/url"
  8. )
  9. var version = "1.0.0"
  10. var client = http.Client{}
  11. func imgproxy (w http.ResponseWriter, r *http.Request) {
  12. // URLを確認
  13. uri, err := url.Parse("https:/" + r.URL.Path)
  14. if err != nil {
  15. fmt.Println(err)
  16. return
  17. }
  18. // HTTPリク
  19. req, err := http.NewRequest("GET", "https:/" + r.URL.Path, nil)
  20. if err != nil {
  21. fmt.Println(err)
  22. return
  23. }
  24. // Pixivかどうかの確認
  25. if uri.Host == "i.pximg.net" || uri.Host == "s.pximg.net" {
  26. req.Header.Set("Referer", "https://www.pixiv.net/")
  27. }
  28. // r.URL.Pathは「/」で始まるから、「https://」じゃなくて、「https:/」となります。
  29. img, err := client.Do(req)
  30. if err != nil {
  31. fmt.Fprintf(w, "Error %d", err)
  32. return
  33. }
  34. // 画像だけをプロクシーする様に
  35. ctype := img.Header.Get("Content-Type")
  36. if ctype != "image/jpeg" && ctype != "image/png" && ctype != "image/gif" && ctype != "image/tga" && ctype != "image/targa" && ctype != "image/webp" {
  37. return
  38. }
  39. // ヘッダー
  40. w.Header().Set("Content-Length", fmt.Sprint(img.ContentLength))
  41. w.Header().Set("Content-Type", img.Header.Get("Content-Type"))
  42. // 表示
  43. if _, err = io.Copy(w, img.Body); err != nil {
  44. log.Fatalf("ioエラー:%v", err)
  45. }
  46. // もう要らない
  47. img.Body.Close()
  48. }
  49. func main () {
  50. http.HandleFunc("/", imgproxy)
  51. http.ListenAndServe(":9810", nil)
  52. }