Search in sources :

Example 1 with NettyDataBuffer

use of org.springframework.core.io.buffer.NettyDataBuffer in project spring-cloud-gateway by spring-cloud.

the class NettyRoutingFilter method filter.

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    URI requestUrl = exchange.getRequiredAttribute(GATEWAY_REQUEST_URL_ATTR);
    String scheme = requestUrl.getScheme();
    if (isAlreadyRouted(exchange) || (!"http".equals(scheme) && !"https".equals(scheme))) {
        return chain.filter(exchange);
    }
    setAlreadyRouted(exchange);
    ServerHttpRequest request = exchange.getRequest();
    final HttpMethod method = HttpMethod.valueOf(request.getMethod().toString());
    final String url = requestUrl.toString();
    HttpHeaders filtered = filterRequest(this.headersFilters.getIfAvailable(), exchange);
    final DefaultHttpHeaders httpHeaders = new DefaultHttpHeaders();
    filtered.forEach(httpHeaders::set);
    String transferEncoding = request.getHeaders().getFirst(HttpHeaders.TRANSFER_ENCODING);
    boolean chunkedTransfer = "chunked".equalsIgnoreCase(transferEncoding);
    boolean preserveHost = exchange.getAttributeOrDefault(PRESERVE_HOST_HEADER_ATTRIBUTE, false);
    return this.httpClient.request(method, url, req -> {
        final HttpClientRequest proxyRequest = req.options(NettyPipeline.SendOptions::flushOnEach).headers(httpHeaders).chunkedTransfer(chunkedTransfer).failOnServerError(false).failOnClientError(false);
        if (preserveHost) {
            String host = request.getHeaders().getFirst(HttpHeaders.HOST);
            proxyRequest.header(HttpHeaders.HOST, host);
        }
        return // I shouldn't need this
        proxyRequest.sendHeaders().send(request.getBody().map(dataBuffer -> ((NettyDataBuffer) dataBuffer).getNativeBuffer()));
    }).doOnNext(res -> {
        ServerHttpResponse response = exchange.getResponse();
        // put headers and status so filters can modify the response
        HttpHeaders headers = new HttpHeaders();
        res.responseHeaders().forEach(entry -> headers.add(entry.getKey(), entry.getValue()));
        HttpHeaders filteredResponseHeaders = HttpHeadersFilter.filter(this.headersFilters.getIfAvailable(), headers, exchange, Type.RESPONSE);
        response.getHeaders().putAll(filteredResponseHeaders);
        response.setStatusCode(HttpStatus.valueOf(res.status().code()));
        // Defer committing the response until all route filters have run
        // Put client response as ServerWebExchange attribute and write response later NettyWriteResponseFilter
        exchange.getAttributes().put(CLIENT_RESPONSE_ATTR, res);
    }).then(chain.filter(exchange));
}
Also used : HttpHeadersFilter.filterRequest(org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter.filterRequest) CLIENT_RESPONSE_ATTR(org.springframework.cloud.gateway.support.ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR) Ordered(org.springframework.core.Ordered) PRESERVE_HOST_HEADER_ATTRIBUTE(org.springframework.cloud.gateway.support.ServerWebExchangeUtils.PRESERVE_HOST_HEADER_ATTRIBUTE) ServerWebExchangeUtils.setAlreadyRouted(org.springframework.cloud.gateway.support.ServerWebExchangeUtils.setAlreadyRouted) ServerHttpResponse(org.springframework.http.server.reactive.ServerHttpResponse) HttpHeaders(org.springframework.http.HttpHeaders) Type(org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter.Type) HttpHeadersFilter(org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter) HttpMethod(io.netty.handler.codec.http.HttpMethod) Mono(reactor.core.publisher.Mono) ServerWebExchange(org.springframework.web.server.ServerWebExchange) HttpStatus(org.springframework.http.HttpStatus) List(java.util.List) ObjectProvider(org.springframework.beans.factory.ObjectProvider) NettyPipeline(reactor.ipc.netty.NettyPipeline) DefaultHttpHeaders(io.netty.handler.codec.http.DefaultHttpHeaders) GATEWAY_REQUEST_URL_ATTR(org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR) HttpClient(reactor.ipc.netty.http.client.HttpClient) HttpClientRequest(reactor.ipc.netty.http.client.HttpClientRequest) URI(java.net.URI) ServerWebExchangeUtils.isAlreadyRouted(org.springframework.cloud.gateway.support.ServerWebExchangeUtils.isAlreadyRouted) NettyDataBuffer(org.springframework.core.io.buffer.NettyDataBuffer) ServerHttpRequest(org.springframework.http.server.reactive.ServerHttpRequest) HttpHeaders(org.springframework.http.HttpHeaders) DefaultHttpHeaders(io.netty.handler.codec.http.DefaultHttpHeaders) ServerHttpRequest(org.springframework.http.server.reactive.ServerHttpRequest) NettyDataBuffer(org.springframework.core.io.buffer.NettyDataBuffer) URI(java.net.URI) ServerHttpResponse(org.springframework.http.server.reactive.ServerHttpResponse) HttpClientRequest(reactor.ipc.netty.http.client.HttpClientRequest) DefaultHttpHeaders(io.netty.handler.codec.http.DefaultHttpHeaders) HttpMethod(io.netty.handler.codec.http.HttpMethod)

Aggregations

DefaultHttpHeaders (io.netty.handler.codec.http.DefaultHttpHeaders)1 HttpMethod (io.netty.handler.codec.http.HttpMethod)1 URI (java.net.URI)1 List (java.util.List)1 ObjectProvider (org.springframework.beans.factory.ObjectProvider)1 HttpHeadersFilter (org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter)1 Type (org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter.Type)1 HttpHeadersFilter.filterRequest (org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter.filterRequest)1 CLIENT_RESPONSE_ATTR (org.springframework.cloud.gateway.support.ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR)1 GATEWAY_REQUEST_URL_ATTR (org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR)1 PRESERVE_HOST_HEADER_ATTRIBUTE (org.springframework.cloud.gateway.support.ServerWebExchangeUtils.PRESERVE_HOST_HEADER_ATTRIBUTE)1 ServerWebExchangeUtils.isAlreadyRouted (org.springframework.cloud.gateway.support.ServerWebExchangeUtils.isAlreadyRouted)1 ServerWebExchangeUtils.setAlreadyRouted (org.springframework.cloud.gateway.support.ServerWebExchangeUtils.setAlreadyRouted)1 Ordered (org.springframework.core.Ordered)1 NettyDataBuffer (org.springframework.core.io.buffer.NettyDataBuffer)1 HttpHeaders (org.springframework.http.HttpHeaders)1 HttpStatus (org.springframework.http.HttpStatus)1 ServerHttpRequest (org.springframework.http.server.reactive.ServerHttpRequest)1 ServerHttpResponse (org.springframework.http.server.reactive.ServerHttpResponse)1 ServerWebExchange (org.springframework.web.server.ServerWebExchange)1