程序基本实现了对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. SpringMVC入门 bug集锦X3和SSM原始整合

  2. Django框架之MVT(2)

    Django框架之MVT 1.        MVT模型 -     module:模型,和数据库相关的 -     template:模板,存放html文件,模板语法(目的是将变量如果巧妙的嵌入到h ...

  3. ES6新特性使用小结(六)

    十三.promise 异步编程 ①.使用 promise 模拟异步操作 { //ES5 中的 callback 解决 异步操作问题 let ajax = function (callback) { c ...

  4. ZipUtils

    package com.yundaex.common.exception.util; import java.io.ByteArrayInputStream; import java.io.ByteA ...

  5. 041 First Missing Positive 第一个缺失的正数

    给一个未排序的数组,找出第一个缺失的正整数.例如,[1,2,0] 返回 3,[3,4,-1,1] 返回 2.你的算法应该在 O(n) 的时间复杂度内完成并且使用常数量的空间.详见:https://le ...

  6. Spark Mllib里如何将如温度、湿度和风速等数值特征字段用除以***进行标准化(图文详解)

    不多说,直接上干货! 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的第18章 决策树回归分类Bike Sharing数据集

  7. es6新语法系列,查找字符串,模板字符串

    一.模板字符串: ES6引入了一种新型的字符串字面量语法,我们称之为模板字符串(template strings).除了使用反撇号字符 ` 代替普通字符串的引号 ' 或 " 外,它们看起来与 ...

  8. java 多线程死锁

    死锁案例: package com.test; public class DealThread implements Runnable { public String username; public ...

  9. springmvc的DispatcherServlet源码——doDispatch方法解析

    DispatcherServlet的doDispatch方法主要用作职责调度工作,本身主要用于控制流程,主要职责如下: 1.文件上传解析,如果请求类型是multipart将通过MultipartRes ...

  10. SpringMVC02 AbstractController And MultiActionController

    1.AbstractController 若处理器继承自AbstractController类,那么该控制器就具有了一些新功能.因为AbstractControll类还继承自一个父类WebConten ...