程序基本实现了对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. 通过T4模板解决EF模型序列号的循环引用问题

    在模型的T4模板(如model.tt)中插入如下代码,这样由模板生成的模型代码中的导航属性将自动带有[JsonIgnore]标识,不会被序列化 1. 添加命名空间的引用 找到以下代码,添加using ...

  2. Tomcat,Apache,JBoss的区别

    1.Apache是Http服务器,Tomcat是web服务器,JBoss是应用服务器. 2.Apache解析静态的html文件:Tomcat可解析jsp动态页面.也可充当servlet容器. 详细内容 ...

  3. IDEA | 创建启动SpringBoot项目命令

    clean package spring-boot:run -Dmaven.test.skip=true

  4. ES6新特性使用小结(五)

    十二.class 与 extends ①.类的基本定义和生成实例 { class Parent{ constructor(name='Lain'){ //定义构造函数 this.name = name ...

  5. jq:jQuery库文件jquery.scrollLoading.js使用方法

    图片延迟加载,滚动到哪里加载到哪里: 1:头部加载库文件 <script type="text/javascript" src="/js/jquery.scroll ...

  6. python大战机器学习——聚类和EM算法

    注:本文中涉及到的公式一律省略(公式不好敲出来),若想了解公式的具体实现,请参考原著. 1.基本概念 (1)聚类的思想: 将数据集划分为若干个不想交的子集(称为一个簇cluster),每个簇潜在地对应 ...

  7. Hive_Hive的数据模型_外部表

    Hive的数据模型之外部表 外部表(External Table)- 指向已经在HDFS中存在的数据,可以创建Partition- 它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异. ...

  8. 服务是如何加载并运行的, Kestrel、配置与环境

    服务是如何加载并运行的, Kestrel.配置与环境 "跨平台"后的ASP.Net Core是如何接收并处理请求的呢? 它的运行和处理机制和之前有什么不同? 本章从"宏观 ...

  9. UI2_同步下载

    // // ViewController.m // UI2_同步下载 // // Created by zhangxueming on 15/7/17. // Copyright (c) 2015年 ...

  10. Redis key 键

    1.set key value    //设置.修改值 2.get key  //如果key不存在,返回nil,表示空. 3.type key   //返回key对应的value的数据类型 4.ren ...