首页 > 编程语言 >使用GO 程序指定IP地址访问 http/https 地址 类似curl --resolve XXXIP:PortYYY

使用GO 程序指定IP地址访问 http/https 地址 类似curl --resolve XXXIP:PortYYY

时间:2023-09-07 16:23:00浏览次数:40  
标签:resolve http XXXIP err fmt Host urlObj response



需求,使用GO 程序指定IP地址访问 http/https 地址

传入参数:

ipAddr // ipv4地址 string值
serviceUrl // url地址 string值
hostContainPort // Host Header 是否带url的端口 bool值

返回值:

responseCode // http状态码 int类型, 
Host // request 请求Host Header string类型

 

// HttpTestOnceHostBindIp http请求测试,指定目的IP地址
func  HttpTestOnceHostBindIp(ipAddr, serviceUrl string, hostContainPort bool) (responseCode int, Host string) {

    //异常处理
    defer func() {
        //捕获异常
        err := recover()
        if err != nil { //条件判断,是否存在异常
            //存在异常,抛出异常
            //fmt.Println(err)
            fmt.println("http请求serviceUrl 一次出错:%v", err)
            responseCode = -8888
        }
    }()
    responseCode = -8888
    urlObj, err := url.Parse(serviceUrl)
    if err != nil {
        fmt.println("url.Parse(serviceUrl) Error: %v", err)
    }
    // 获取传入URL的端口是什么,有指定获取指定的,没有指定根据http/https协议默认端口传入
    var port string
    // 1. 有指定端口
    if strings.Contains(urlObj.Host, ":") {
        hostSlice := strings.Split(urlObj.Host, ":")
        if len(hostSlice) >= 1 {
            port = hostSlice[1]
        }
    } else {
        // 2. 没有指定端口 使用默认端口
        if urlObj.Scheme == "https" {
            port = "443"
        } else if urlObj.Scheme == "http" {
            port = "80"
        }
    }
    //fmt.Println("urlObj.Host: ", urlObj.Host)     // 根据url获取Host
    //fmt.Println("urlObj.Scheme: ", urlObj.Scheme) // http请求协议,http或者https
    //port := "80"
    request, err := http.NewRequest("GET", urlObj.String(), bytes.NewBuffer([]byte{}))

    // 规则要求带端口的url如果Host不包含Port就把 HTTP请求的Host头里的:端口号去掉
    if !hostContainPort {
        if strings.Contains(urlObj.Host, ":") {
            hostSlice := strings.Split(urlObj.Host, ":")
            if len(hostSlice) >= 1 {
                request.Host = hostSlice[0]
            }
        }
    }

    defer request.Body.Close() //
    var response *http.Response

    // 一、 绑定固定的IP
    // 1. 先准备一个Dialer对象
    dialer := &net.Dialer{
        Timeout:   7 * time.Second,
        KeepAlive: 30 * time.Second,
    }
    transport := &http.Transport{
        // 2. 插入特别的改写条件,然后继续利用原先的DialContext逻辑
        DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
            addr = ipAddr + ":" + port
            //if addr == "api.lewinblog.com:80" {
            //    addr = "127.0.0.1:80"
            //}
            return dialer.DialContext(ctx, network, addr)
        },
    }

    // 客户端禁止重定向
    client := &http.Client{
        CheckRedirect: noRedirect, //http客户端禁止重定向
        Transport:     transport,
    }
    //response, err = http.DefaultClient.Do(request)
    response, err = client.Do(request)
    if err != nil {
        fmt.println("client.Do(request) Error:%v", err)
    }
    if response != nil {
        responseCode = response.StatusCode

        if response.Body != nil {
            err = response.Body.Close() //必须关闭否则自动打开的goroutine无法关闭
            if err != nil {
                fmt.println("response.Body.Close()Error:%v", err)
            }
        }
        fmt.println("serviceUrl %v ip: %s response Code: %v", serviceUrl, ipAddr, responseCode)
    }
    Host = request.Host
    return
}

 

标签:resolve,http,XXXIP,err,fmt,Host,urlObj,response
From: https://www.cnblogs.com/zhangmingda/p/17685267.html

相关文章

  • Padavan配置https后台访问
    设置https访问时需要SSL证书,证书有两种方法获取:padavan可以生成一个证书,只不过是未经浏览器认证的证书从域名服务商申请第三方机构的证书,比如阿里云、腾讯云等一、Padavan生成的证书1、web进入Padavan管理后台,选择左侧高级设置--->系统设置,web服务器协议选择“HTTP&HTTPS”......
  • 安卓版本7.0以上无法抓包https
    无法抓包原因:安卓版本7.0以上,不信任用户证书,只信任系统证书用户证书:访问网址下载的证书系统证书:获取root权限导入系统指定的安全目录解决方法:在charles的help菜单栏ssl-proxying里保存charles的pem证书在本地opensslx509-subject\_hash\_old-in/path/charle......
  • 【错误记录】Android Studio 创建 Module 模块报错 ( Cannot resolve external depend
    文章目录一、报错信息二、解决方案目前使用的是最新的Gradle配置,创建Module生成的源码与Gradle配置出现了冲突,导致的问题;解决此类问题,要仔细检查Gradle构建脚本,排查每个依赖库的来源;本次错误就是AS系统自动成的Module修改了Gradle构建脚本,导......
  • java http传参及使用的注解
    javahttp传参及使用的注解:TTP协议组成协议内容示例对应Spring注解pathinfo传参/articles/12(查询id为12的文章,12是参数)@PathVariableURLQueryString传参/articles?id=12@RequestParamBody传参Content-Type:multipart/form-data@RequestParamBod......
  • springboot 服务端接口公网远程调试﹣实现 HTTP 服务监听【端口映射】
    前言前后端分离项目中,在调用接口调试时候,我们可以通过cpolar内网穿透将本地服务端接口模拟公共网络环境远程调用调试,本次教程我们以Java服务端接口为例。1.本地环境搭建1.1环境参数JDK1.8IDEASpringBootMavenTomcat9.0Postman1.2搭建springboot服务项目搭建一个springboot服务的......
  • 报org.apache.axis cannot be resolved to a type且Syntax error on token "enum", cl
    一位专门负责导数据和单点登录模块的同事最近提交了一些代码,但由于他出差了,代码同步下来却发现报如下的错误:org.apache.axiscannotberesolvedtoatype且Syntaxerrorontoken"enum",classexpected错误查看出错文件发现代码中凡是出现“oper.setStyle(org.apache.axis.enum......
  • HTTPS加密协议详解:HTTPS性能与优化
    1、HTTPS性能损耗前文讨论了HTTPS原理与优势:身份验证、信息加密与完整性校验等,且未对TCP和HTTP协议做任何修改。但通过增加新协议以实现更安全的通信必然需要付出代价,HTTPS协议的性能损耗主要体现如下:(1).增加延时分析前面的握手过程,一次完整的握手至少需要两端依次来回两次通信,至......
  • HTTPS加密协议详解:TLS/SSL握手过程
    1、握手与密钥协商过程基于RSA握手和密钥交换的客户端验证服务器为示例详解TLS/SSL握手过程。(1).client_hello客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息,相关信息如下:支持的最高TSL协议版本version,从低到高依次SSLv2SS......
  • HTTPS 的加密流程
    在网络上如果进行明文传输数据,是非常危险的操作,只有加密操作才能保证安全加密方式大致分为两类 对称加密:对称加密就是通过同一个密钥,把明文加密为密文,并且也能将密文解密成明文但是由于客户端生成密钥,需要发送给服务器,此时密钥只能明文传输,密钥可能被黑客截取为了使密钥更安全的......
  • 你知道HTTP与HTTPS有什么区别吗?
    每天都在上网,在搜索东西的时候,你有发现网址有什么不同吗?本文就来谈谈HTTP与HTTPS有什么不同。一、什么是HTTP?HTTP是“HyperTextTransferProtocol”的简称,翻译过来就是超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议。简单来说就是一种发布和接收HTML页面......