Golang 简单 http 代理转发
程序基本实现了对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 代理转发的更多相关文章
- windows下使用密钥登录Linux及xshell代理转发
1.密钥登录原理 一般我们使用xshell访问远程主机(Linux主机)时,都是先请管理员给我们开一个账户,即为我们设置一个一个用户名和对应的密码,然后我们就可以使用下面的方式登录到远程主机了: 在这 ...
- 【转】Nginx反向代理转发tomcat
http://blog.csdn.net/mlc1218559742/article/details/53117520 最近刚接触nginx,在网上查阅了相关资料,看到最多的形容nginx的词就是反向 ...
- 10分钟学会windows中iis搭建服务器集群实现负载均衡和nginx代理转发
前言 我们之前聊过 10分钟搭建服务器集群--Windows7系统中nginx与IIS服务器搭建集群实现负载均衡:https://www.cnblogs.com/xiongze520/p/103087 ...
- curl运行json串,代理转发格式
curl -b 'uin=o0450654733; skey=@tq9xjRvYy' -H "Content-Type: application/json" -X POST -d ...
- [Golang] 一个简易代理池
晚上写了一个代理池,就是在一个代理网站上爬取代理ip和端口以及测试是否可用.接下来可能考虑扩展成一个比较大的 golang实现的代理池. 简易版代码: package main import ( &q ...
- nginx简单反向代理和负载均衡(ubuntu)
nginx简单反向代理与负载均衡 环境:三台ubuntu 12.04.5 虚拟机 均装有nginx 1.1.19 以下u1(192.168.240.129) ,u2(192.168.240.13 ...
- IIS充当代理转发请求到Kestrel
接着上篇博文为ASP.NetCore程序启用SSL的code,这篇将介绍如何用IIS充当反向代理的角色转发请求到Kestrel服务器 与ASP.NET不同,ASP.netCore使用的是自托管web服 ...
- Nginx代理转发Apache+svn
1.安装svn和httpd yum install httpd yum install subversion mod_dav_svn 创建仓库目录 mkdir -p /var/www/svn 3.创建 ...
- nginx反向代理转发后页面上的js css文件无法加载【原创】
故障现象:nginx做代理转发后,发现页面上的js css文件无法加载,页面样式乱了. 原因:没有配置静态资源 解决js css文件无法加载无法访问的问题 解决办法: 修改配置文件nginx.conf ...
随机推荐
- jQuery EasyUI/TopJUI输入框事件监听
jQuery EasyUI/TopJUI输入框事件监听 代码如下: <div data-toggle="topjui-panel" title="" da ...
- Composer的简单使用
.前期准备: 1.下载安装包,https://getcomposer.org/download/ 2.在php.ini文档中打开extension=php_openssl.dll 3.下载php_ss ...
- WordCount by C# 结对编程
合作者:201631062210,201631062110 Gitee项目地址:https://gitee.com/zhouyue98/learngit 本次作业的链接地址:https://edu.c ...
- Ajax案例:异步加载商品分类信息
- 搞定vscode编写java
下载vscode: 地址: https://code.visualstudio.com/ 安装插件 我这里下载的是绿色版,所以解压后 向桌面发送一个快捷方式 找到VS Code 的快捷方式位置: 右键 ...
- hdu5709Claris Loves Painting主席树 奇妙的DFS序
先不考虑层数限制 一棵树上每个点有个颜色,问一棵子树的颜色数 感觉简单多了是吧 考虑每个点的贡献:自己到根的路径上的一个包含自己的连续段 观察最顶端的点的父亲: 它满足有了额外的同色孩子(咦) 这一条 ...
- Python 踩坑之旅进程篇其三pgid是个什么鬼 (子进程\子孙进程无法kill 退出的解法)
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4.1 技术关键字 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 Github: https: ...
- docker安装软件
镜像相关命令 1.搜索镜像 # docker search java 可使用 docker search命令搜索存放在 Docker Hub(这是docker官方提供的存放所有docker镜像软件的地 ...
- 疯狂使用 leancloud (投稿文章)
疯狂使用 leancloud 本文章是投稿文章,已在 leancloud 微信公众号发表. 这里是原文,内容有调整. 3年,从工程师到创始人 觉得不错可以点这里进行 leancloud 注册 项目背景 ...
- 搭建本地SVN資料
基于網上眾多教程,搭建SVN成功:VisualSVN Server + TortoiseSVN Client. 過程比較簡單,就不重複書寫了. 部份參考資料,感謝作者: 什麽是SVN及如何應用 htt ...