使用Golang转发HTTP流数据

土豆吞噬者 · · 1401 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        _, _ = w.Write([]byte("fm transfer"))
    })
    http.HandleFunc("/fm", handleFm)
    _ = http.ListenAndServe(":80", nil)
}

func sendRequest(url string) (<-chan []byte,chan bool) {
    dataChannel :=make(chan []byte, 10)
    exitSignal:=make(chan bool)
    go func() {
        res, err := http.Get(url)
        if err != nil {
            return
        }
        defer res.Body.Close()

        for {
            select {
            case <-exitSignal:
                fmt.Println("sendRequest goroutine exit!")
                return
            default:{
                buf := make([]byte, 4096)
                n, err:= res.Body.Read(buf)
                if err != nil || n == 0{
                    fmt.Println("recv data error!")
                    return
                }else{
                    dataChannel<-buf[:n]
                }
            }
            }
        }
    }()

    return dataChannel,exitSignal
}



func sendResponse(w http.ResponseWriter,dataChannel <-chan []byte) {
    for {
        responseData,ok := <- dataChannel
        if (!ok){
            fmt.Println("read data error!")
            break
        }
        n, err := w.Write(responseData)
        if err != nil || n == 0 {
            fmt.Println("send data error!")
            break
        }
    }
}

func handleFm(w http.ResponseWriter, r *http.Request) {
    _ = r.ParseForm()
    url:=r.Form.Get("url")
    w.Header().Set("Content-Type","audio/mpeg")
    w.Header().Set("transfer-encoding","identity")
    dataChannel,exitSignal:=sendRequest(url);
    sendResponse(w,dataChannel)
    exitSignal<-true
    fmt.Println("handleFm finish!")
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:土豆吞噬者

查看原文:使用Golang转发HTTP流数据

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1401 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传