MCPcopy Index your code
hub / github.com/subtrace/subtrace / proxyHTTP1

Method proxyHTTP1

cmd/run/socket/proxy.go:367–512  ·  view source on GitHub ↗

proxyHTTP1 proxies an HTTP connection between the client and server.

(cli, srv *bufConn)

Source from the content-addressed store, hash-verified

365
366// proxyHTTP1 proxies an HTTP connection between the client and server.
367func (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:

Callers 1

proxyOptimisticMethod · 0.95

Calls 15

newHijackerMethod · 0.95
discardMultiMethod · 0.95
UseRequestMethod · 0.95
UseResponseMethod · 0.95
UseWebsocketMessagesMethod · 0.95
FinishMethod · 0.95
copyRawSingleMethod · 0.95
NewParserFunction · 0.92
newSimpleListenerFunction · 0.85
newWebsocketFunction · 0.85
CopyMethod · 0.80
proxyMethod · 0.80

Tested by

no test coverage detected