| 116 | } |
| 117 | |
| 118 | func (cfg *Engine) ReceiveRequest(s quic.Stream, conn quic.Connection) error { |
| 119 | defer s.Close() |
| 120 | wr := &myResponseWriter2{Stream: s} |
| 121 | reader := bufio.NewReader(s) |
| 122 | var req *http.Request |
| 123 | url, _, err := reader.ReadLine() |
| 124 | if err == nil { |
| 125 | ctx, cancel := context.WithCancel(s.Context()) |
| 126 | defer cancel() |
| 127 | req, err = http.NewRequestWithContext(ctx, "GET", string(url), reader) |
| 128 | for err == nil { |
| 129 | var h []byte |
| 130 | if h, _, err = reader.ReadLine(); len(h) > 0 { |
| 131 | if b, a, f := strings.Cut(string(h), ": "); f { |
| 132 | req.Header.Set(b, a) |
| 133 | } |
| 134 | } else { |
| 135 | break |
| 136 | } |
| 137 | } |
| 138 | |
| 139 | if err == nil { |
| 140 | h, _ := cfg.mux.Handler(req) |
| 141 | if req.Header.Get("Accept") == "text/event-stream" { |
| 142 | go h.ServeHTTP(wr, req) |
| 143 | } else if req.Header.Get("Upgrade") == "websocket" { |
| 144 | var writer myResponseWriter3 |
| 145 | writer.Stream = s |
| 146 | writer.Connection = conn |
| 147 | req.Host = req.Header.Get("Host") |
| 148 | if req.Host == "" { |
| 149 | req.Host = req.URL.Host |
| 150 | } |
| 151 | if req.Host == "" { |
| 152 | req.Host = "m7s.live" |
| 153 | } |
| 154 | h.ServeHTTP(&writer, req) //建立websocket连接,握手 |
| 155 | } else { |
| 156 | h.ServeHTTP(wr, req) |
| 157 | } |
| 158 | } |
| 159 | io.ReadAll(s) |
| 160 | } |
| 161 | if err != nil { |
| 162 | log.Error("read console server error:", err) |
| 163 | } |
| 164 | return err |
| 165 | } |