Skip to content

Instantly share code, notes, and snippets.

@stevenferrer
Forked from fabrizioc1/http-proxy.go
Created September 18, 2019 06:33
Show Gist options
  • Save stevenferrer/2ca97b3d8203da1333188c24f0c57798 to your computer and use it in GitHub Desktop.
Save stevenferrer/2ca97b3d8203da1333188c24f0c57798 to your computer and use it in GitHub Desktop.

Revisions

  1. @fabrizioc1 fabrizioc1 revised this gist Dec 24, 2012. 1 changed file with 74 additions and 43 deletions.
    117 changes: 74 additions & 43 deletions http-proxy.go
    Original file line number Diff line number Diff line change
    @@ -1,57 +1,88 @@
    package main

    import (
    "io"
    "log"
    "net/http"
    "fmt"
    "io"
    "log"
    "net/http"
    )

    type HttpConnection struct {
    Request *http.Request
    Response *http.Response
    }

    type HttpConnectionChannel chan *HttpConnection

    var connChannel = make(HttpConnectionChannel)

    func PrintHTTP(conn *HttpConnection) {
    fmt.Printf("%v %v\n", conn.Request.Method, conn.Request.RequestURI)
    for k, v := range conn.Request.Header {
    fmt.Println(k, ":", v)
    }
    fmt.Println("==============================")
    fmt.Printf("HTTP/1.1 %v\n", conn.Response.Status)
    for k, v := range conn.Response.Header {
    fmt.Println(k, ":", v)
    }
    fmt.Println(conn.Response.Body)
    fmt.Println("==============================")
    }

    func HandleHTTP() {
    for {
    select {
    case conn := <-connChannel:
    PrintHTTP(conn)
    }
    }
    }

    type Proxy struct {
    }

    func NewProxy() *Proxy { return &Proxy{} }

    func (p *Proxy) ServeHTTP(wr http.ResponseWriter, r *http.Request) {
    var resp *http.Response
    var err error

    switch r.Method {
    default:
    {
    log.Print("Cannot handle method ", r.Method)
    http.Error(wr, "501 I only handle GET and POST", http.StatusNotImplemented)
    return
    }
    case "GET":
    {
    log.Printf("getting %v", r.RequestURI)
    resp, err = http.Get(r.RequestURI)
    r.Body.Close()
    }
    case "POST":
    {
    resp, err = http.Post(r.RequestURI, r.Header.Get("Content-Type"), r.Body)
    r.Body.Close()
    }
    }

    // combined for GET/POST
    if err != nil {
    http.Error(wr, err.Error(), http.StatusInternalServerError)
    return
    }
    wr.Header().Set("Content-Type", resp.Header.Get("Content-Type"))
    wr.WriteHeader(resp.StatusCode)

    io.Copy(wr, resp.Body)

    resp.Body.Close()
    var resp *http.Response
    var err error
    var req *http.Request
    client := &http.Client{}

    //log.Printf("%v %v", r.Method, r.RequestURI)
    req, err = http.NewRequest(r.Method, r.RequestURI, r.Body)
    for name, value := range r.Header {
    req.Header.Set(name, value[0])
    }
    resp, err = client.Do(req)
    r.Body.Close()

    // combined for GET/POST
    if err != nil {
    http.Error(wr, err.Error(), http.StatusInternalServerError)
    return
    }

    conn := &HttpConnection{r, resp}

    for k, v := range resp.Header {
    wr.Header().Set(k, v[0])
    }
    wr.WriteHeader(resp.StatusCode)
    io.Copy(wr, resp.Body)
    resp.Body.Close()

    PrintHTTP(conn)
    //connChannel <- &HttpConnection{r,resp}
    }

    func main() {
    proxy := NewProxy()
    err := http.ListenAndServe(":12345", proxy)
    if err != nil {
    log.Fatal("ListenAndServe: ", err.Error())
    }
    }
    //go HandleHTTP()
    proxy := NewProxy()
    fmt.Println("==============================")
    err := http.ListenAndServe(":12345", proxy)
    if err != nil {
    log.Fatal("ListenAndServe: ", err.Error())
    }
    }
  2. @fabrizioc1 fabrizioc1 created this gist Dec 18, 2012.
    57 changes: 57 additions & 0 deletions http-proxy.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,57 @@
    package main

    import (
    "io"
    "log"
    "net/http"
    )

    type Proxy struct {
    }

    func NewProxy() *Proxy { return &Proxy{} }

    func (p *Proxy) ServeHTTP(wr http.ResponseWriter, r *http.Request) {
    var resp *http.Response
    var err error

    switch r.Method {
    default:
    {
    log.Print("Cannot handle method ", r.Method)
    http.Error(wr, "501 I only handle GET and POST", http.StatusNotImplemented)
    return
    }
    case "GET":
    {
    log.Printf("getting %v", r.RequestURI)
    resp, err = http.Get(r.RequestURI)
    r.Body.Close()
    }
    case "POST":
    {
    resp, err = http.Post(r.RequestURI, r.Header.Get("Content-Type"), r.Body)
    r.Body.Close()
    }
    }

    // combined for GET/POST
    if err != nil {
    http.Error(wr, err.Error(), http.StatusInternalServerError)
    return
    }
    wr.Header().Set("Content-Type", resp.Header.Get("Content-Type"))
    wr.WriteHeader(resp.StatusCode)

    io.Copy(wr, resp.Body)

    resp.Body.Close()
    }

    func main() {
    proxy := NewProxy()
    err := http.ListenAndServe(":12345", proxy)
    if err != nil {
    log.Fatal("ListenAndServe: ", err.Error())
    }
    }