walkthroughs/howto-http2/color_client/main.go (71 lines of code) (raw):
package main
import (
"crypto/tls"
"fmt"
"io/ioutil"
"log"
"net"
"net/http"
"os"
"golang.org/x/net/http2"
)
func main() {
color_host := os.Getenv("COLOR_HOST")
if color_host == "" {
log.Fatalf("no COLOR_HOST defined")
}
port := os.Getenv("PORT")
if port == "" {
log.Fatalf("no PORT defined")
}
log.Printf("COLOR_HOST is: %v", color_host)
log.Printf("PORT is: %v", port)
// Create an h2c client
client := &http.Client{
Transport: &http2.Transport{
// Allow non-https urls
AllowHTTP: true,
// Make the transport *not-actually* use TLS
DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) {
return net.Dial(network, addr)
},
},
}
http.HandleFunc("/ping", func(w http.ResponseWriter, req *http.Request) {})
http.HandleFunc("/color", func(w http.ResponseWriter, req *http.Request) {
resp, err := client.Get("http://" + color_host)
if err != nil {
http.Error(w, err.Error(), 500)
log.Printf("Could not get color: %v", err)
return
}
defer resp.Body.Close()
color, err := ioutil.ReadAll(resp.Body)
if err != nil {
http.Error(w, err.Error(), 400)
log.Printf("Could not read response body: %v", err)
return
}
log.Printf("Got color response: %s", string(color))
fmt.Fprint(w, string(color))
})
http.HandleFunc("/setFlake", func(w http.ResponseWriter, req *http.Request) {
resp, err := client.Get("http://" + color_host + req.URL.RequestURI())
if err != nil {
http.Error(w, err.Error(), 500)
log.Printf("Could not set flakiness: %v", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
http.Error(w, err.Error(), 400)
log.Printf("Could not read response body: %v", err)
return
}
log.Printf("Got setFlake response: %s", string(body))
if resp.StatusCode != 200 {
http.Error(w, string(body), resp.StatusCode)
return
}
fmt.Fprint(w, string(body))
})
log.Fatal(http.ListenAndServe("0.0.0.0:"+port, nil))
}