程序基本实现了对http的完整转发,目前暂不支持https

windows需要在设置中的网络>代理设置为手动,并开启代理服务器,填写ip和端口

// httpForward
package main import (
"fmt"
"io"
"io/ioutil"
"net/http"
"os"
"strconv"
"strings"
) func HttpForward(pattern string, port int) {
http.HandleFunc(pattern, doGo)
strPort := strconv.Itoa(port)
fmt.Print("listenning on :", " ", pattern, " ", strPort, "\n")
err := http.ListenAndServe(":"+strPort, nil)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
} func doGo(w http.ResponseWriter, r *http.Request) { //r.host不带http,r.url是完整的url
//fmt.Println(r.Host, " ", r.URL, "\n") fmt.Println("url: ", r.URL) //查看url各个信息
// str := "hi ,it is working"
// b := []byte(str)
//w.Write(b)
//fmt.Print(r.Host, " ", r.Method, " \nr.URL.String ", r.URL.String(), " r.URL.Host ", r.URL.Host, " r.URL.Fragment ", r.URL.Fragment, " r.URL.Hostname ", r.URL.Hostname(), " r.URL.RequestURI ", r.URL.RequestURI(), " r.URL.Scheme ", r.URL.Scheme) cli := &http.Client{} //不建议用readfull,对于body大小难以判断,容易出错
// body := make([]byte, 2048000)
// n, err := io.ReadFull(r.Body, body) body, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Print("io.ReadFull(r.Body, body) ", err.Error())
//return,没有数据也是可以的,不需要直接结束
}
fmt.Print("req count :", len(body), "\n") //fmt.Print(len(body))
//reqUrl := r.Host + r.URL.String() reqUrl := r.URL.String() //url里带了协议类型,不需要用scheme
// if r.URL.Scheme != "" {
// reqUrl = r.URL.Scheme + reqUrl
// } else {
// reqUrl = "http://" + reqUrl
// } req, err := http.NewRequest(r.Method, reqUrl, strings.NewReader(string(body)))
if err != nil {
fmt.Print("http.NewRequest ", err.Error())
return
} //用遍历header实现完整复制
//contentType := r.Header.Get("Content-Type")
//req.Header.Set("Content-Type", contentType) for k, v := range r.Header {
req.Header.Set(k, v[0])
}
res, err := cli.Do(req)
if err != nil {
fmt.Print("cli.Do(req) ", err.Error())
return
}
defer res.Body.Close() // n, err = io.ReadFull(res.Body, body)
// if err != nil {
// fmt.Print("io.ReadFull(res.Body, body) ", err.Error())
// return
// }
//fmt.Print("count body bytes: ", n, "\n") for k, v := range res.Header {
w.Header().Set(k, v[0])
}
io.Copy(w, res.Body) //这样复制对大小控制较差,不建议。用copy即可
// io.WriteString(w, string(body[:n]))
// fmt.Print(string(body))
}

我发现使用https时,程序似乎接收不到请求,没有反应,不知道是不是证书的问题

Golang 简单 http 代理转发的更多相关文章

  1. windows下使用密钥登录Linux及xshell代理转发

    1.密钥登录原理 一般我们使用xshell访问远程主机(Linux主机)时,都是先请管理员给我们开一个账户,即为我们设置一个一个用户名和对应的密码,然后我们就可以使用下面的方式登录到远程主机了: 在这 ...

  2. 【转】Nginx反向代理转发tomcat

    http://blog.csdn.net/mlc1218559742/article/details/53117520 最近刚接触nginx,在网上查阅了相关资料,看到最多的形容nginx的词就是反向 ...

  3. 10分钟学会windows中iis搭建服务器集群实现负载均衡和nginx代理转发

    前言 我们之前聊过 10分钟搭建服务器集群--Windows7系统中nginx与IIS服务器搭建集群实现负载均衡:https://www.cnblogs.com/xiongze520/p/103087 ...

  4. curl运行json串,代理转发格式

    curl -b 'uin=o0450654733; skey=@tq9xjRvYy' -H "Content-Type: application/json" -X POST -d ...

  5. [Golang] 一个简易代理池

    晚上写了一个代理池,就是在一个代理网站上爬取代理ip和端口以及测试是否可用.接下来可能考虑扩展成一个比较大的 golang实现的代理池. 简易版代码: package main import ( &q ...

  6. nginx简单反向代理和负载均衡(ubuntu)

    nginx简单反向代理与负载均衡 环境:三台ubuntu 12.04.5 虚拟机    均装有nginx 1.1.19 以下u1(192.168.240.129) ,u2(192.168.240.13 ...

  7. IIS充当代理转发请求到Kestrel

    接着上篇博文为ASP.NetCore程序启用SSL的code,这篇将介绍如何用IIS充当反向代理的角色转发请求到Kestrel服务器 与ASP.NET不同,ASP.netCore使用的是自托管web服 ...

  8. Nginx代理转发Apache+svn

    1.安装svn和httpd yum install httpd yum install subversion mod_dav_svn 创建仓库目录 mkdir -p /var/www/svn 3.创建 ...

  9. nginx反向代理转发后页面上的js css文件无法加载【原创】

    故障现象:nginx做代理转发后,发现页面上的js css文件无法加载,页面样式乱了. 原因:没有配置静态资源 解决js css文件无法加载无法访问的问题 解决办法: 修改配置文件nginx.conf ...

随机推荐

  1. IBM Websphere MQ常用命令及常见错误

    MQSC: MQ Script Command  (不区分大小写) 注明: 下面命令行中的队列管理器名字,队列名字分别用QmgrName, QName替代. 下面标蓝色的,都需要根据实际配置更改! 打 ...

  2. XML与JSON的区别

    JSON和XML的比较 ◆可读性 JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负. ◆可扩展性 XML天生有很好的扩展性,JSON当然也有,没有什么是XML ...

  3. linux替换文件中的某个字符串的命令sed

    sed -i 's/java-7-oracle/java-8-oracle/g' /etc/init.d/tomcat7 上面的命令是将tomcat7中的java-7-oracle替换为java-8- ...

  4. 老男孩IT教育-每日一题汇总

    老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...

  5. 转Keil 中使用 STM32F4xx 硬件浮点单元

    Keil 中使用 STM32F4xx 硬件浮点单元一.前言有工程师反应说 Keil 下无法使用 STM32F4xx 硬件浮点单元, 导致当运算浮点时运算时间过长,还有 一些人反应不知如何使用芯片芯片内 ...

  6. C#微信支付

    回归主题,16年1月初我对微信开发比较好奇,由于自己是一个比较喜欢钱的人,所以对支付功能颇为冲动,就用公司信息在微信平台申请了一个服务号,还给腾讯打赏了300大洋做了下认证,抽空看了下微信支付官方的文 ...

  7. 浅谈C#解析网页

    最近做了一个项目,要求获取各大主流网页上的关键信息,本人以前了解过网页爬虫的知识,所以想到了网页爬虫了实现功能 第一次尝试: 采用webclient获取远程网页的内容,然后采用正则表达式进行过滤 但, ...

  8. linux 环境下备份oracle 数据库

    登陆linux后,进入oracle的安装目录下,找到bin那个目录,进入bin目录ls -l 看这些命令的所有者: su - oracle这时会进入这个用户的主目录/home/oracle,此时,可以 ...

  9. 安装vs2013提示必须安装ie10的解决办法

    虽说应该直接安装ie10,但试了下并不是很顺利,找到如下解决办法,亲测通过. 新建bat文件,内容如下,右键以管理员身份运行,vs即可正常安装. @ECHO OFF :IE10HACK REG ADD ...

  10. AngularJS(三):重复HTML元素、数据绑定

    本文也同步发表在我的公众号“我的天空” 重复HTML元素 在前端的页面编写中,我们会经常遇到重复HTML元素,譬如绘制表格.菜单等,如以下代码显示一个简单的li列表: <body>    ...