首页 > 其他分享 >go写的http工具

go写的http工具

时间:2024-08-15 15:41:14浏览次数:5  
标签:http err nil resp Println go return 工具

go build reverseProxy.go
reverseProxy http://192.168.50.148:12321
2024/08/15 15:14:47 program start......
2024/08/15 15:14:47 listen http proxy on :8001.....
浏览器中输入:http://127.0.0.1:8001/,即可访问指定网站,并打印http请求与返回数据包。


package main

import (
"bytes"
"fmt"
"log"
"io/ioutil"
"net/http"
"net/http/httputil"
"net/url"
"os"
)

type transport struct {
http.RoundTripper
}

func (t *transport) RoundTrip(req *http.Request) (resp *http.Response, err error) {
// 获取请求报文的内容长度
len := req.ContentLength
if(len > 0){
log.Println("req.ContentLength", len)
b1, err1 := ioutil.ReadAll(req.Body)
if err1 != nil {
fmt.Println(err1.Error())
return nil, err1
}else{
fmt.Println(string(b1))
}

err1 = req.Body.Close()
if err1 != nil {
return nil, err1
}

// 重新生成可读取的
body1 := ioutil.NopCloser(bytes.NewReader(b1))
req.Body = body1
}

resp, err = t.RoundTripper.RoundTrip(req)
if err != nil {
return nil, err
}

b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}

err = resp.Body.Close()
if err != nil {
return nil, err
}

log.Println("resp.ContentLength", resp.ContentLength)
fmt.Println(string(b))

//读取响应并修改响应
b = bytes.Replace(b, []byte("Google"), []byte("GOOGLE"), -1)
body := ioutil.NopCloser(bytes.NewReader(b))
resp.Body = body
return resp, nil
}

func sameHost(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
r.Host = r.URL.Host
handler.ServeHTTP(w, r)
})
}

func main() {
var sz string
if(len(os.Args)<2){
fmt.Printf("请输入url:")//http://127.0.0.1:80 or http://192.168.50.148:12321
fmt.Scanf("%s",&sz)
}else{
sz=os.Args[1]
}
targetURL, err := url.Parse(sz)
log.Println("program start......")
if err != nil {
log.Println("bad url:", err)
return
}
reverseProxy := httputil.NewSingleHostReverseProxy(targetURL)
//http.HandleFunc("/myinfo/", httpUserInfo)
//http.Handle("/", reverseProxy)
reverseProxy.Transport = &transport{http.DefaultTransport}
// wrap that proxy with our sameHost function
singleHosted := sameHost(reverseProxy)
log.Println("listen http proxy on :8001.....")
http.ListenAndServe(":8001", singleHosted)
//http.ListenAndServe(":8001", nil)
}

标签:http,err,nil,resp,Println,go,return,工具
From: https://www.cnblogs.com/Ivanhan2019/p/18361067

相关文章

  • kafka可视化操作工具kafka-Eagle安装部署
    kafka-Eagle安装部署下载地址下载kafka-eagle的安装包,下载地址:https://github.com/smartloli/kafka-eagle-bin/releases环境要求部署之前,需要先装jdk8,maven,并且配置好相应环境变量部署我这边是下载的v3.0.2版本。修改配置文件下载完成后,修改配置文件信息  conf\sys......
  • Pixelorama v1.0.1 官方版下载及安装教程 (像素画绘制工具)
    前言Pixelorama是一款免费的像素画创作工具,它功能丰富,操作直观,适合创作像素艺术。无论是制作游戏素材还是个人艺术项目,Pixelorama都能帮助你轻松绘制出多彩的像素图,而且支持多图层和多种格式的导入导出,非常适合像素艺术爱好者和游戏开发者使用。一、下载地址下载链接:分享......
  • 推荐项目:安企CMS - 一款使用 GoLang 开发的企业内容管理系统
    安企内容管理系统(AnqiCMS),是一款基于iris框架,使用GoLang开发的企业内容管理系统。https://gitcode.com/anqicms/anqicms/overview推荐理由安企内容管理系统(AnqiCMS),是一款基于iris框架,使用GoLang开发的企业内容管理系统。它部署简单,软件相对于传统的PHP开发......
  • 38k Star!颠覆传统BI,Metabase新一代智能数据分析工具
    Metabase是一个开源的商业智能(BI)工具,帮助用户轻松地从数据库中提取数据,并将其转化为易于理解的图表和仪表板。与传统的BI工具相比,Metabase不需要用户具备编写SQL的能力,非技术人员也能通过简单的操作创建有用的报告和可视化数据分析。Metabase主要特性部署便捷:比传统的......
  • 打卡信奥刷题(563)用Scratch图形化工具信奥B2078[普及组/提高] 含 k 个 3 的数
    含k个3的数题目描述输入两个正整数mmm和kkk,其中......
  • istio可用工具kiali
    1.安装kubectlcreate-fsamples/addons/   #安装这个目录下的所有插件//kubectlcreate-fsamples/addons/kiali.yaml//kubectlcreate-fsamples/addons/jaeger.yaml2.修改kialiservicetypekubectleditsvc kiali-n istio-system  把ClusterIp改为......
  • Go 链路追踪入门 Opentelemetry
    前言Opentelemetry分布式链路跟踪( DistributedTracing)的概念最早是由Google提出来的,发展至今技术已经比较成熟,也是有一些协议标准可以参考。目前在Tracing技术这块比较有影响力的是两大开源技术框架:Netflix公司开源的OpenTracing和Google开源的OpenCensus。两大框架......
  • 基于django+vue基于微信小程序的校园二手物品交易系统演示录像22023【开题报告+程序+
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高校教育环境的日益完善和学生生活水平的提高,校园内二手物品交易的需求日益增长。然而,传统的线下交易方式如张贴广告、校园论坛发帖等......
  • 基于django+vue基于微信小程序的校园二手物品交易系统演示录像12023【开题报告+程序+
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着校园生活的丰富多彩,学生们在追求知识的同时,也积累了大量的二手物品,如书籍、电子产品、生活用品等。这些物品在毕业后或不再需要时往往......
  • C++标准库 algorithm 堆操作 heap
    算法库-堆操作基本操作make_heap()(1)从一个元素范围创建出一个最大堆(2)将区间内的元素转化为heap.--传比较器push_heap()对heap增加一个元素.将一个元素加入到一个最大堆pop_heap()对heap取出下一个元素.从最大堆中移除最大元素sort_heap()对heap转化为一......