K&

 

思维导图

 

 

 

 

反代检查目录输出查询到日志

 

 

package logging

import (
    "log"
    "net/http"
    "os"
    "os/exec"
    "time"
)

//创建存储信息的文件并返回文件指针
func createFile(dir string) *os.File{
    file,err := os.OpenFile(dir + "/urlPath.log",os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644)
    if err != nil {
        log.Println(err)
    }
    return file
}

//判断文件夹是否存在,如果文件存在系统不会认为是错误所以err会为nil。可以直接判断是不是目录
func Exist(dir string) {
    fileInfo, err := os.Stat(dir)
    if err == nil {
        //如果为true那么就是目录什么都不用做返回停止这个函数就可以了
        if fileInfo.IsDir(){
            //直接退出函数啥都不做
            return
        }else{
            cmdOutPut(dir)
        }
    }
    //err不为空如果isnotexist判断是true那么就是文件夹不存在
    if os.IsNotExist(err) {
        cmdOutPut(dir)
    }
}

func cmdOutPut(dir string) {
    cmd := exec.Command("mkdir",dir)
    _,err := cmd.CombinedOutput()
    if err != nil{
        log.Println(err)
    }
}


//调用函数
func LogRecord(r *http.Request,dir string)  {
    Exist(dir)
    //因为文件用了要关闭,不关存在资源泄露问题,轻的如果是独占那么就会涉及文件移动不可以之类的
    file := createFile(dir)
    //函数结束前关闭文件,解决上面说的问题
    defer file.Close()
    //存储信息到文件中,因为writestring要的是字符串所以input就要是字符串
    file.WriteString(time.Now().Format(time.RFC3339) + " " + r.URL.Path + "\n")
}

 

package main

import (
    "crypto/tls"
    "gogin/proxy/logging"
    "log"
    "net"
    "net/http"
    "net/http/httputil"
    "net/url"
    "time"
)

func main() {
    //就是跳过证书验证,那个单词拆开翻译一下就理解了
    var tlsConfig *tls.Config = &tls.Config{
        InsecureSkipVerify: true,
    }
    //代理实现的默认参数
    var transport http.RoundTripper = &http.Transport{
        DialContext: (&net.Dialer{
            Timeout:   30 * time.Second,
            KeepAlive: 30 * time.Second,
        }).DialContext,
        ForceAttemptHTTP2:     true,
        MaxIdleConns:          100,
        IdleConnTimeout:       90 * time.Second,
        TLSHandshakeTimeout:   10 * time.Second,
        ExpectContinueTimeout: 1 * time.Second,
        TLSClientConfig:       tlsConfig,
    }

    http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
        url, err := url.Parse("代理的地址")
        if err != nil {
            log.Println(err)
        }
        //记录访问api有助理解
        logging.LogRecord(request, "log")
        proxy := httputil.NewSingleHostReverseProxy(url)
        //用上面的参数把默认的代替掉主要就是为了跳过证书验证哪个部分
        proxy.Transport = transport
        //就是路由处理器的实现接口,可以把func看成路由也就是handler
        proxy.ServeHTTP(writer, request)
    })
    //监听机器的所有ip和端口
    http.ListenAndServe("监控的ip:port", nil)
}

 

本文作者手写,转发请注明出处。非常感谢。

posted on 2022-01-12 10:42  K&  阅读(69)  评论(0编辑  收藏  举报