go-http-unix-socket

package main

import (
    "context"
    "fmt"
    "io"
    "io/ioutil"
    "log"
    "net"
    "net/http"
    "time"
)

var handlersMap = make(map[string]http.HandlerFunc)

func f1(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "software is healthy\n")
}

type bluetool struct {
}

func (bt *bluetool) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    msg := fmt.Sprintf("url is %s\n",r.URL.String())
    io.WriteString(w, msg)
    if h, ok := handlersMap[r.URL.String()]; ok {
        h(w, r)
    }
}

func main() {
    sockpath := "/data/unix.socket"

    // server
    bt := new(bluetool)
    handlersMap["/health"] = f1

    // unix socket
    addr, err := net.ResolveUnixAddr("unix", sockpath)
    if err != nil {
        panic("Cannot resolve unix addr: " + err.Error())
    }
    fmt.Println(addr.String())

    listener, err := net.ListenUnix("unix", addr)
    defer listener.Close()
    if err != nil {
        panic("Cannot listen to unix domain socket: " + err.Error())
    }
    fmt.Println("Listening on", listener.Addr())

    donec := make(chan struct{})
    go func() {
        defer close(donec)
        http.Serve(listener, bt)
    }()
    defer func() {
        listener.Close()
        <-donec
    }()


    // client
    defaultTimeout := 10 * time.Second
    tr := new(http.Transport)
    tr.DisableCompression = true
    tr.DialContext = func(_ context.Context, _, _ string) (net.Conn, error) {
        return net.DialTimeout("unix", sockpath, defaultTimeout)
    }
    client := &http.Client{Transport: tr}

    if _, ok := client.Transport.(http.RoundTripper); !ok {
        fmt.Printf("unable to verify TLS configuration, invalid transport %v", client.Transport)
    }


    //url := "http://" + listener.Addr().String() + "/health"
    //pingUrl := url.URL{Scheme:"unix",Host:sockpath, Path:path.Join("/","/health")}
    //fmt.Println(pingUrl)

    var body io.Reader
    body=nil
    request, err := http.NewRequest("GET", "/health", body)
    request.URL.Scheme="http"
    request.URL.Host = sockpath
    // fmt.Println(request)

    resp, err := client.Do(request)
    if err != nil {
        log.Fatalf("fetch error: %v", err)
    }
    b, err := ioutil.ReadAll(resp.Body)
    resp.Body.Close()
    if err != nil {
        log.Fatalf("fetch error: reading %v", err)
    }
    fmt.Println(string(b))
}

转载于:https://www.cnblogs.com/walkinginthesun/p/10397539.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值