go代理服务器代码
go代理服务器代码最近用废弃的小笔记本搭了个centos服务器挂着,搭了ssh,tomcat,go环境,想搭个代理服务器访问路由,不想安装,想自己写一个,顺便复习一下go语言知识。 一开始,我网上搜了一下go语言写代理服务器的代理,搜索到一个: package main
import (
"http"
"log"
"os"
"io/ioutil"
)
func handler(w http.ResponseWriter,r *http.Request) {
resp,err := http.DefaultClient.Do(r)
defer resp.Body.Close()
if err != nil { panic(err) }
for k,v := range resp.Header {
for _,vv := range v {
w.Header().Add(k,vv)
}
}
for _,c := range resp.SetCookie {
w.Header().Add("Set-Cookie",c.Raw)
}
w.WriteHeader(resp.StatusCode)
result,err := ioutil.ReadAll(resp.Body)
if err != nil && err != os.EOF { panic(err) }
w.Write(result)
}
func main() {
http.HandleFunc("/",handler)
log.Println("Start serving on port 8888")
http.ListenAndServe(":8888",nil)
os.Exit(0)
}
写成文件上传到服务器,go build test.go 编译,发现resp.SetCookie根本没有这个方法,编译不通过,上面文章说它要最新的http源码并编译到go源码里,我都惊呆了,还要修改它的源码啊,我看了下自己的go语言版本,是1.4.2,是15年今年的了,他写的文章的时候是13年,呵呵了,我的比他的新多了,怎么可能会旧?!还有他说的编译源码,是多么复杂啊~ 于是乎。机智的我,为了编译通过,活生生的把它注释了。 好像完成了喔,于是去浏览器设置一下代理,打开baidu.com,他告诉我方法错误了,我查看了一下打印信息,发现 就是说,ttp.DefaultClient.Do(r)这个用法是不正确的,是不能这样设置的,于是我找了一个替代品:http.NewRequest,它的优点就是可以get也可以post,应该还有put等操作,没尝试。 于是这段handler function被我耐心的改成了这样: func handler(w http.ResponseWriter,r *http.Request) {
fmt.Println("url:",r.RequestURI)
fmt.Println("method:",r.Method)
fmt.Println("header:",r.Header)
client0 := &http.Client{}
req,_ := http.NewRequest(r.Method,r.RequestURI,r.Body)
fmt.Printf("send:%+vn",req) //看下发送的结构
resp,err := client0.Do(req) //发送
if err!=nil {
fmt.Println("error:",err)
}
defer resp.Body.Close()
for _,value := range resp.Request.Cookies() {
w.Header().Add(value.Name,value.Value)
}
for k,v := range resp.Header {
for _,vv := range v {
w.Header().Add(k,vv)
}
}
w.WriteHeader(resp.StatusCode)
result,err := ioutil.ReadAll(resp.Body)
if (err != nil) {
fmt.Println("error:",err)
}
fmt.Println("result:",result);
_,err = w.Write(result)
if (err != nil) {
fmt.Println("error:",err)
}
实际上我是在mac电脑上编辑的,用服务器上传在编译运行速度太慢了 = =、 最后浏览了一下整改代理服务器的代码: package main
import (
"net/http"
"log"
"io/ioutil"
"fmt"
)
func handler(w http.ResponseWriter,r *http.Request) {
req,r.Body)
for k,v := range r.Header {
for _,vv := range v {
req.Header.Add(k,vv)
}
}
req.Header.Set("Content-Type","application/x-www-form-urlencoded; param=value")
client := &http.Client{}
resp,err := client.Do(req)
if err!=nil {
fmt.Println("error:",err)
}
defer resp.Body.Close()
for k,vv)
}
}
for _,value.Value)
}
w.WriteHeader(resp.StatusCode)
result,err)
}
_,err)
}
}
func main() {
http.HandleFunc("/",handler)
log.Println("Start serving on port 8089")
err := http.ListenAndServe(":8089",nil)
if (err!=nil) {
log.Println("error:",err)
}
}
看看自己改的代码,和网上那个人得代码,原来相差那么多,看哭了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |