proxyHTTP1 proxies an HTTP connection between the client and server.
(cli, srv *bufConn)
| 365 | |
| 366 | // proxyHTTP1 proxies an HTTP connection between the client and server. |
| 367 | func (p *proxy) proxyHTTP1(cli, srv *bufConn) error { |
| 368 | slog.Debug("starting proxyHTTP1", "proxy", p) |
| 369 | |
| 370 | if !p.isOutgoing && p.global.Devtools != nil && p.global.Devtools.HijackPath != "" { |
| 371 | lis := newSimpleListener(cli) |
| 372 | defer lis.Close() |
| 373 | |
| 374 | h := p.newHijacker(srv) |
| 375 | |
| 376 | mp := martian.NewProxy() |
| 377 | defer mp.Close() |
| 378 | |
| 379 | mp.SetRequestModifier(h) |
| 380 | mp.SetRoundTripper(h) |
| 381 | |
| 382 | if err := mp.Serve(lis); err != nil { |
| 383 | return fmt.Errorf("martian: serve: %w", err) |
| 384 | } |
| 385 | return nil |
| 386 | } |
| 387 | |
| 388 | errs := make(chan error, 3) |
| 389 | |
| 390 | cr, cw := io.Pipe() |
| 391 | sr, sw := io.Pipe() |
| 392 | |
| 393 | go func() { |
| 394 | bcr, bsr := bufio.NewReader(cr), bufio.NewReader(sr) |
| 395 | defer p.discardMulti(bcr, bsr) |
| 396 | |
| 397 | for { |
| 398 | req, err := http.ReadRequest(bcr) |
| 399 | switch { |
| 400 | case err == nil: |
| 401 | case errors.Is(err, io.EOF) || errors.Is(err, net.ErrClosed): |
| 402 | errs <- nil |
| 403 | return |
| 404 | default: |
| 405 | errs <- fmt.Errorf("tracer: read request: %w", err) |
| 406 | return |
| 407 | } |
| 408 | |
| 409 | eventID := uuid.New() |
| 410 | slog.Debug("proxy: http/1: new event", "proxy", p, "eventID", eventID) |
| 411 | |
| 412 | event := p.tmpl.Copy() |
| 413 | event.Set("event_id", eventID.String()) |
| 414 | |
| 415 | parser := tracer.NewParser(p.global, event) |
| 416 | parser.UseRequest(req) |
| 417 | go func() { |
| 418 | defer req.Body.Close() |
| 419 | io.Copy(io.Discard, req.Body) |
| 420 | }() |
| 421 | |
| 422 | resp, err := http.ReadResponse(bsr, req) |
| 423 | switch { |
| 424 | case err == nil: |
no test coverage detected