github.com/xraypb/xray-core@v1.6.6/proxy/blackhole/blackhole.go (about)

     1  // Package blackhole is an outbound handler that blocks all connections.
     2  package blackhole
     3  
     4  //go:generate go run github.com/xraypb/xray-core/common/errors/errorgen
     5  
     6  import (
     7  	"context"
     8  	"time"
     9  
    10  	"github.com/xraypb/xray-core/common"
    11  	"github.com/xraypb/xray-core/transport"
    12  	"github.com/xraypb/xray-core/transport/internet"
    13  )
    14  
    15  // Handler is an outbound connection that silently swallow the entire payload.
    16  type Handler struct {
    17  	response ResponseConfig
    18  }
    19  
    20  // New creates a new blackhole handler.
    21  func New(ctx context.Context, config *Config) (*Handler, error) {
    22  	response, err := config.GetInternalResponse()
    23  	if err != nil {
    24  		return nil, err
    25  	}
    26  	return &Handler{
    27  		response: response,
    28  	}, nil
    29  }
    30  
    31  // Process implements OutboundHandler.Dispatch().
    32  func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error {
    33  	nBytes := h.response.WriteTo(link.Writer)
    34  	if nBytes > 0 {
    35  		// Sleep a little here to make sure the response is sent to client.
    36  		time.Sleep(time.Second)
    37  	}
    38  	common.Interrupt(link.Writer)
    39  	return nil
    40  }
    41  
    42  func init() {
    43  	common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
    44  		return New(ctx, config.(*Config))
    45  	}))
    46  }