类org.springframework.http.server.reactive.AbstractServerHttpResponse源码实例Demo

下面列出了怎么用org.springframework.http.server.reactive.AbstractServerHttpResponse的API类实例代码及写法,或者点击链接到github查看源代码。

@Override
public Mono<Void> upgrade(ServerWebExchange exchange, WebSocketHandler handler,
		@Nullable String subProtocol, Supplier<HandshakeInfo> handshakeInfoFactory) {

	ServerHttpResponse response = exchange.getResponse();
	HttpServerResponse reactorResponse = ((AbstractServerHttpResponse) response).getNativeResponse();
	HandshakeInfo handshakeInfo = handshakeInfoFactory.get();
	NettyDataBufferFactory bufferFactory = (NettyDataBufferFactory) response.bufferFactory();

	return reactorResponse.sendWebsocket(subProtocol, this.maxFramePayloadLength,
			(in, out) -> {
				ReactorNettyWebSocketSession session =
						new ReactorNettyWebSocketSession(
								in, out, handshakeInfo, bufferFactory, this.maxFramePayloadLength);
				URI uri = exchange.getRequest().getURI();
				return handler.handle(session).checkpoint(uri + " [ReactorNettyRequestUpgradeStrategy]");
			});
}
 
@Override
public Mono<Void> upgrade(ServerWebExchange exchange, WebSocketHandler handler,
		@Nullable String subProtocol, Supplier<HandshakeInfo> handshakeInfoFactory) {

	ServerHttpResponse response = exchange.getResponse();
	HttpServerResponse reactorResponse = ((AbstractServerHttpResponse) response).getNativeResponse();
	HandshakeInfo handshakeInfo = handshakeInfoFactory.get();
	NettyDataBufferFactory bufferFactory = (NettyDataBufferFactory) response.bufferFactory();

	return reactorResponse.sendWebsocket(subProtocol, this.maxFramePayloadLength,
			(in, out) -> {
				ReactorNettyWebSocketSession session =
						new ReactorNettyWebSocketSession(
								in, out, handshakeInfo, bufferFactory, this.maxFramePayloadLength);
				return handler.handle(session);
			});
}
 
public static boolean setResponseStatus(ServerWebExchange exchange,
		HttpStatusHolder statusHolder) {
	if (exchange.getResponse().isCommitted()) {
		return false;
	}
	if (log.isDebugEnabled()) {
		log.debug("Setting response status to " + statusHolder);
	}
	if (statusHolder.getHttpStatus() != null) {
		return setResponseStatus(exchange, statusHolder.getHttpStatus());
	}
	if (statusHolder.getStatus() != null
			&& exchange.getResponse() instanceof AbstractServerHttpResponse) { // non-standard
		((AbstractServerHttpResponse) exchange.getResponse())
				.setStatusCodeValue(statusHolder.getStatus());
		return true;
	}
	return false;
}
 
源代码4 项目: spring-cloud-gateway   文件: NettyRoutingFilter.java
private void setResponseStatus(HttpClientResponse clientResponse,
		ServerHttpResponse response) {
	HttpStatus status = HttpStatus.resolve(clientResponse.status().code());
	if (status != null) {
		response.setStatusCode(status);
	}
	else {
		while (response instanceof ServerHttpResponseDecorator) {
			response = ((ServerHttpResponseDecorator) response).getDelegate();
		}
		if (response instanceof AbstractServerHttpResponse) {
			((AbstractServerHttpResponse) response)
					.setStatusCodeValue(clientResponse.status().code());
		}
		else {
			// TODO: log warning here, not throw error?
			throw new IllegalStateException("Unable to set status code "
					+ clientResponse.status().code() + " on response of type "
					+ response.getClass().getName());
		}
	}
}
 
private void writeStatusAndHeaders(ServerHttpResponse response) {
	if (response instanceof AbstractServerHttpResponse) {
		((AbstractServerHttpResponse) response).setStatusCodeValue(this.statusCode);
	}
	else {
		HttpStatus status = HttpStatus.resolve(this.statusCode);
		if (status == null) {
			throw new IllegalStateException(
					"Unresolvable HttpStatus for general ServerHttpResponse: " + this.statusCode);
		}
		response.setStatusCode(status);
	}
	copy(this.headers, response.getHeaders());
	copy(this.cookies, response.getCookies());
}
 
private void writeStatusAndHeaders(ServerHttpResponse response) {
	if (response instanceof AbstractServerHttpResponse) {
		((AbstractServerHttpResponse) response).setStatusCodeValue(this.statusCode);
	}
	else {
		HttpStatus status = HttpStatus.resolve(this.statusCode);
		if (status == null) {
			throw new IllegalStateException(
					"Unresolvable HttpStatus for general ServerHttpResponse: " + this.statusCode);
		}
		response.setStatusCode(status);
	}
	copy(this.headers, response.getHeaders());
	copy(this.cookies, response.getCookies());
}
 
@Override
public Tags apply(ServerWebExchange exchange) {
	String outcome = "CUSTOM";
	String status = "CUSTOM";
	String httpStatusCodeStr = "NA";

	String httpMethod = exchange.getRequest().getMethodValue();

	// a non standard HTTPS status could be used. Let's be defensive here
	// it needs to be checked for first, otherwise the delegate response
	// who's status DIDN'T change, will be used
	if (exchange.getResponse() instanceof AbstractServerHttpResponse) {
		Integer statusInt = ((AbstractServerHttpResponse) exchange.getResponse())
				.getStatusCodeValue();
		if (statusInt != null) {
			status = String.valueOf(statusInt);
			httpStatusCodeStr = status;
			HttpStatus resolved = HttpStatus.resolve(statusInt);
			if (resolved != null) {
				// this is not a CUSTOM status, so use series here.
				outcome = resolved.series().name();
				status = resolved.name();
			}
		}
	}
	else {
		HttpStatus statusCode = exchange.getResponse().getStatusCode();
		if (statusCode != null) {
			httpStatusCodeStr = String.valueOf(statusCode.value());
			outcome = statusCode.series().name();
			status = statusCode.name();
		}
	}

	return Tags.of("outcome", outcome, "status", status, "httpStatusCode",
			httpStatusCodeStr, "httpMethod", httpMethod);
}
 
private HttpServletResponse getHttpServletResponse(ServerHttpResponse response) {
	Assert.isInstanceOf(AbstractServerHttpResponse.class, response);
	return ((AbstractServerHttpResponse) response).getNativeResponse();
}
 
private HttpServletResponse getHttpServletResponse(ServerHttpResponse response) {
	Assert.isInstanceOf(AbstractServerHttpResponse.class, response, "ServletServerHttpResponse required");
	return ((AbstractServerHttpResponse) response).getNativeResponse();
}
 
@Override
public Mono<Void> handleResult(ServerWebExchange exchange, HandlerResult result) {

	Mono<?> returnValueMono;
	MethodParameter bodyParameter;
	ReactiveAdapter adapter = getAdapter(result);
	MethodParameter actualParameter = result.getReturnTypeSource();

	if (adapter != null) {
		Assert.isTrue(!adapter.isMultiValue(), "Only a single ResponseEntity supported");
		returnValueMono = Mono.from(adapter.toPublisher(result.getReturnValue()));
		bodyParameter = actualParameter.nested().nested();
	}
	else {
		returnValueMono = Mono.justOrEmpty(result.getReturnValue());
		bodyParameter = actualParameter.nested();
	}

	return returnValueMono.flatMap(returnValue -> {
		HttpEntity<?> httpEntity;
		if (returnValue instanceof HttpEntity) {
			httpEntity = (HttpEntity<?>) returnValue;
		}
		else if (returnValue instanceof HttpHeaders) {
			httpEntity = new ResponseEntity<>((HttpHeaders) returnValue, HttpStatus.OK);
		}
		else {
			throw new IllegalArgumentException(
					"HttpEntity or HttpHeaders expected but got: " + returnValue.getClass());
		}

		if (httpEntity instanceof ResponseEntity) {
			ResponseEntity<?> responseEntity = (ResponseEntity<?>) httpEntity;
			ServerHttpResponse response = exchange.getResponse();
			if (response instanceof AbstractServerHttpResponse) {
				((AbstractServerHttpResponse) response).setStatusCodeValue(responseEntity.getStatusCodeValue());
			}
			else {
				response.setStatusCode(responseEntity.getStatusCode());
			}
		}

		HttpHeaders entityHeaders = httpEntity.getHeaders();
		HttpHeaders responseHeaders = exchange.getResponse().getHeaders();
		if (!entityHeaders.isEmpty()) {
			entityHeaders.entrySet().stream()
					.forEach(entry -> responseHeaders.put(entry.getKey(), entry.getValue()));
		}

		if (httpEntity.getBody() == null || returnValue instanceof HttpHeaders) {
			return exchange.getResponse().setComplete();
		}

		String etag = entityHeaders.getETag();
		Instant lastModified = Instant.ofEpochMilli(entityHeaders.getLastModified());
		HttpMethod httpMethod = exchange.getRequest().getMethod();
		if (SAFE_METHODS.contains(httpMethod) && exchange.checkNotModified(etag, lastModified)) {
			return exchange.getResponse().setComplete();
		}

		return writeBody(httpEntity.getBody(), bodyParameter, actualParameter, exchange);
	});
}
 
private HttpServletResponse getHttpServletResponse(ServerHttpResponse response) {
	Assert.isInstanceOf(AbstractServerHttpResponse.class, response);
	return ((AbstractServerHttpResponse) response).getNativeResponse();
}
 
private HttpServletResponse getHttpServletResponse(ServerHttpResponse response) {
	Assert.isInstanceOf(AbstractServerHttpResponse.class, response, "ServletServerHttpResponse required");
	return ((AbstractServerHttpResponse) response).getNativeResponse();
}
 
@Override
public Mono<Void> handleResult(ServerWebExchange exchange, HandlerResult result) {

	Mono<?> returnValueMono;
	MethodParameter bodyParameter;
	ReactiveAdapter adapter = getAdapter(result);
	MethodParameter actualParameter = result.getReturnTypeSource();

	if (adapter != null) {
		Assert.isTrue(!adapter.isMultiValue(), "Only a single ResponseEntity supported");
		returnValueMono = Mono.from(adapter.toPublisher(result.getReturnValue()));
		bodyParameter = actualParameter.nested().nested();
	}
	else {
		returnValueMono = Mono.justOrEmpty(result.getReturnValue());
		bodyParameter = actualParameter.nested();
	}

	return returnValueMono.flatMap(returnValue -> {
		HttpEntity<?> httpEntity;
		if (returnValue instanceof HttpEntity) {
			httpEntity = (HttpEntity<?>) returnValue;
		}
		else if (returnValue instanceof HttpHeaders) {
			httpEntity = new ResponseEntity<>((HttpHeaders) returnValue, HttpStatus.OK);
		}
		else {
			throw new IllegalArgumentException(
					"HttpEntity or HttpHeaders expected but got: " + returnValue.getClass());
		}

		if (httpEntity instanceof ResponseEntity) {
			ResponseEntity<?> responseEntity = (ResponseEntity<?>) httpEntity;
			ServerHttpResponse response = exchange.getResponse();
			if (response instanceof AbstractServerHttpResponse) {
				((AbstractServerHttpResponse) response).setStatusCodeValue(responseEntity.getStatusCodeValue());
			}
			else {
				response.setStatusCode(responseEntity.getStatusCode());
			}
		}

		HttpHeaders entityHeaders = httpEntity.getHeaders();
		HttpHeaders responseHeaders = exchange.getResponse().getHeaders();
		if (!entityHeaders.isEmpty()) {
			entityHeaders.entrySet().stream()
					.forEach(entry -> responseHeaders.put(entry.getKey(), entry.getValue()));
		}

		if (httpEntity.getBody() == null || returnValue instanceof HttpHeaders) {
			return exchange.getResponse().setComplete();
		}

		String etag = entityHeaders.getETag();
		Instant lastModified = Instant.ofEpochMilli(entityHeaders.getLastModified());
		HttpMethod httpMethod = exchange.getRequest().getMethod();
		if (SAFE_METHODS.contains(httpMethod) && exchange.checkNotModified(etag, lastModified)) {
			return exchange.getResponse().setComplete();
		}

		return writeBody(httpEntity.getBody(), bodyParameter, actualParameter, exchange);
	});
}
 
 类所在包
 同包方法