eintopf.info@v0.13.16/service/osmproxy/transport.go (about)

     1  package osmproxy
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"net/http"
     7  
     8  	"eintopf.info/internal/xhttp"
     9  	"github.com/go-chi/chi/v5"
    10  )
    11  
    12  func Router() func(chi.Router) {
    13  	return func(r chi.Router) {
    14  		r.Get("/tile/{z}/{x}/{y}.png", func(w http.ResponseWriter, r *http.Request) {
    15  			osmURL := fmt.Sprintf(
    16  				"https://tile.openstreetmap.de/%s/%s/%s.png",
    17  				chi.URLParam(r, "z"),
    18  				chi.URLParam(r, "x"),
    19  				chi.URLParam(r, "y"),
    20  			)
    21  
    22  			r2, err := http.NewRequest("GET", osmURL, nil)
    23  			if err != nil {
    24  				xhttp.WriteInternalError(r.Context(), w, err)
    25  				return
    26  			}
    27  			r2.Header = r.Header
    28  			r2.Header.Del("User-Agent")
    29  			c := &http.Client{}
    30  
    31  			response, err := c.Do(r2)
    32  			if err != nil {
    33  				xhttp.WriteInternalError(r.Context(), w, err)
    34  				return
    35  			}
    36  			data, err := io.ReadAll(response.Body)
    37  			if err != nil {
    38  				xhttp.WriteInternalError(r.Context(), w, err)
    39  				return
    40  			}
    41  			for k, vs := range response.Header {
    42  				for _, v := range vs {
    43  					w.Header().Add(k, v)
    44  				}
    45  			}
    46  			w.Write(data)
    47  		})
    48  	}
    49  }