Class ProxyEndpoint

All Implemented Interfaces:
ShouldFilter<HttpRequestMessage>, SyncZuulFilter<HttpRequestMessage,HttpResponseMessage>, ZuulFilter<HttpRequestMessage,HttpResponseMessage>, io.netty.util.concurrent.GenericFutureListener<io.netty.util.concurrent.Future<PooledConnection>>, EventListener

@Filter(order=0, type=ENDPOINT) public class ProxyEndpoint extends SyncZuulFilterAdapter<HttpRequestMessage,HttpResponseMessage> implements io.netty.util.concurrent.GenericFutureListener<io.netty.util.concurrent.Future<PooledConnection>>
Not thread safe! New instance of this class is created per HTTP/1.1 request proxied to the origin but NOT for each attempt/retry. All the retry attempts for a given HTTP/1.1 request proxied share the same EdgeProxyEndpoint instance Created by saroskar on 5/31/17.
  • Field Details

  • Constructor Details

  • Method Details

    • getAttemptNum

      public int getAttemptNum()
    • getRequestAttempts

      public RequestAttempts getRequestAttempts()
    • getCurrentRequestAttempt

      protected RequestAttempt getCurrentRequestAttempt()
    • getPassport

      public CurrentPassport getPassport()
    • getOrigin

      public NettyOrigin getOrigin()
    • getZuulRequest

      public HttpRequestMessage getZuulRequest()
    • finish

      public void finish(boolean error)
    • filterName

      public String filterName()
      Specified by:
      filterName in interface ZuulFilter<HttpRequestMessage,HttpResponseMessage>
    • apply

      Specified by:
      apply in interface SyncZuulFilter<HttpRequestMessage,HttpResponseMessage>
    • processContentChunk

      public io.netty.handler.codec.http.HttpContent processContentChunk(ZuulMessage zuulReq, io.netty.handler.codec.http.HttpContent chunk)
      Description copied from interface: ZuulFilter
      Optionally transform HTTP content chunk received.
      Specified by:
      processContentChunk in interface ZuulFilter<HttpRequestMessage,HttpResponseMessage>
      Overrides:
      processContentChunk in class SyncZuulFilterAdapter<HttpRequestMessage,HttpResponseMessage>
    • getDefaultOutput

      public HttpResponseMessage getDefaultOutput(HttpRequestMessage input)
      Description copied from interface: ZuulFilter
      Choose a default message to use if the applyAsync() method throws an exception.
      Specified by:
      getDefaultOutput in interface ZuulFilter<HttpRequestMessage,HttpResponseMessage>
      Returns:
      ZuulMessage
    • invokeNext

      public void invokeNext(HttpResponseMessage zuulResponse)
    • invokeNext

      public void invokeNext(io.netty.handler.codec.http.HttpContent chunk)
    • updateOriginRpsTrackers

      protected void updateOriginRpsTrackers(NettyOrigin origin, int attempt)
    • createRequestStat

      protected RequestStat createRequestStat()
      Override to track your own request stats.
    • operationComplete

      public void operationComplete(io.netty.util.concurrent.Future<PooledConnection> connectResult)
      Specified by:
      operationComplete in interface io.netty.util.concurrent.GenericFutureListener<io.netty.util.concurrent.Future<PooledConnection>>
    • getOriginResponseReceiver

      protected OriginResponseReceiver getOriginResponseReceiver()
    • preWriteToOrigin

      protected void preWriteToOrigin(com.netflix.zuul.discovery.DiscoveryResult chosenServer, HttpRequestMessage zuulRequest)
    • isRemoteZuulRetriesBelowRetryLimit

      protected boolean isRemoteZuulRetriesBelowRetryLimit(int maxAllowedRetries)
    • isBelowRetryLimit

      protected boolean isBelowRetryLimit()
    • errorFromOrigin

      public void errorFromOrigin(Throwable ex)
    • postErrorProcessing

      protected void postErrorProcessing(Throwable ex, SessionContext zuulCtx, ErrorType err, com.netflix.zuul.discovery.DiscoveryResult chosenServer, int attemptNum)
    • isRetryable

      protected boolean isRetryable(ErrorType err)
    • isRequestReplayable

      protected boolean isRequestReplayable()
      Request is replayable on a different origin IFF A) we have not started to send response back to the client AND B) we have not lost any of its body chunks
    • responseFromOrigin

      public void responseFromOrigin(io.netty.handler.codec.http.HttpResponse originResponse)
    • handleOriginSuccessResponse

      protected void handleOriginSuccessResponse(io.netty.handler.codec.http.HttpResponse originResponse, com.netflix.zuul.discovery.DiscoveryResult chosenServer)
    • handleOriginNonSuccessResponse

      protected void handleOriginNonSuccessResponse(io.netty.handler.codec.http.HttpResponse originResponse, com.netflix.zuul.discovery.DiscoveryResult chosenServer)
    • isRetryable5xxResponse

      public boolean isRetryable5xxResponse(HttpRequestMessage zuulRequest, io.netty.handler.codec.http.HttpResponse originResponse)
    • originIndicatesRetryableInternalServerError

      protected boolean originIndicatesRetryableInternalServerError(io.netty.handler.codec.http.HttpResponse response)
    • transformRequest

      protected HttpRequestMessage transformRequest(HttpRequestMessage requestMsg)
    • addCustomRequestHeaders

      protected void addCustomRequestHeaders(Headers headers)
    • getOrigin

      @Nullable protected NettyOrigin getOrigin(HttpRequestMessage request)
      Get the implementing origin. Note: this method gets called in the constructor so if overloading it or any methods called within, you cannot rely on your own constructor parameters.
    • injectCustomOriginName

      @Nullable protected OriginName injectCustomOriginName(HttpRequestMessage request)
      Inject your own custom VIP based on your own processing Note: this method gets called in the constructor so if overloading it or any methods called within, you cannot rely on your own constructor parameters.
      Returns:
      null if unused.
    • originNotFound

      @ForOverride protected void originNotFound(SessionContext context, String causeName)
    • getTimeoutManager

      @ForOverride protected OriginTimeoutManager getTimeoutManager(NettyOrigin origin)