All Downloads are FREE. Search and download functionalities are using the official Maven repository.

open.source.exchange.parser.ServerHttpRequestParser Maven / Gradle / Ivy

package open.source.exchange.parser;

import java.net.InetSocketAddress;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.server.RequestPath;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.SslInfo;
import org.springframework.stereotype.Service;
import org.springframework.util.MultiValueMap;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import open.source.exchange.model.ExBase;
import open.source.exchange.model.ExHttpCookie;
import open.source.exchange.model.ExHttpHeaders;
import open.source.exchange.model.ExHttpMethod;
import open.source.exchange.model.ExInetSocketAddress;
import open.source.exchange.model.ExMultiValueMap;
import open.source.exchange.model.ExRequestPath;
import open.source.exchange.model.ExServerHttpRequest;
import open.source.exchange.model.ExSslInfo;
import open.source.exchange.model.ExURI;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@Log4j2
@Service
@RequiredArgsConstructor
public class ServerHttpRequestParser {

	@Autowired
	private ObjectParser objectParser;

	@Autowired
	private MultiValueMapParser multiValueMapParser;

	@Autowired
	private HttpCookieParser httpCookieParser;

	@Autowired
	private HttpHeadersParser httpHeadersParser;

	@Autowired
	private HttpMethodParser httpMethodParser;

	@Autowired
	private RequestPathParser requestPathParser;

	@Autowired
	private InetSocketAddressParser inetSocketAddressParser;

	@Autowired
	private SslInfoParser sslInfoParser;

	@Autowired
	private URIParser uriParser;

	@Autowired
	private DataBufferListParser dataBufferListParser;

	private Mono parseAsyncState(ServerHttpRequest serverHttpRequest, ExServerHttpRequest exServerHttpRequest) {

		log.trace("parse async state -> (serverHttpRequest) {} (exServerHttpRequest) {}", serverHttpRequest, exServerHttpRequest);

		// TODO : fix it
		// https://stackoverflow.com/questions/45240005/how-to-log-request-and-response-bodies-in-spring-webflux
		// java.lang.IllegalStateException: Only one connection receive subscriber allowed.
		// https://blog.csdn.net/u011084148/article/details/100144727
		/*
		return serverHttpRequest.getBody()
			.collectList()
			.map(dataBufferList -> {
				String completeDataBufferString = dataBufferListParser.parse(dataBufferList);
				exServerHttpRequest.setBody(completeDataBufferString);
				return exServerHttpRequest;
			});
		*/
		//Flux body = serverHttpRequest.getBody();
		//body.collectList().doOnNext(onNext);
		//body.collectList().doOnSuccess(onSuccess);
		//body.collectList().doOnSuccessOrError(onSuccessOrError);
		return Mono.just(exServerHttpRequest);
	}

	private void parseSyncState(ServerHttpRequest serverHttpRequest, ExServerHttpRequest exServerHttpRequest) {

		log.trace("parse sync state -> (serverHttpRequest) {} (exServerHttpRequest) {}", serverHttpRequest, exServerHttpRequest);

		MultiValueMap cookies = serverHttpRequest.getCookies();
		ExMultiValueMap exMultiValueMap = multiValueMapParser.parse(cookies);
		ExMultiValueMap exCookies = null;
		if (null != exMultiValueMap) {
			exCookies = new ExMultiValueMap();
			exCookies.setClazz(exMultiValueMap.getClazz());
			exCookies.setHashCode(exMultiValueMap.getHashCode());
			exCookies.setToString(exMultiValueMap.getToString());
			exCookies.setSize(exMultiValueMap.getSize());
			exCookies.setEmpty(exMultiValueMap.isEmpty());
			Map> mapVsList = exMultiValueMap.getMapVsList();
			Map> mapVsExList = null;
			if (null != mapVsList) {
				mapVsExList = new TreeMap>();
				for (String key : mapVsList.keySet()) {
					List values = mapVsList.get(key);
					List exValueList = null;
					if (null != values) {
						exValueList = new ArrayList();
						for (HttpCookie httpCookie : values) {
							ExHttpCookie exHttpCookie = httpCookieParser.parse(httpCookie);
							exValueList.add(exHttpCookie);
						}
					}
					mapVsExList.put(key, exValueList);
				}
			}
			exCookies.setMapVsList(mapVsExList);
		}
		exServerHttpRequest.setCookies(exCookies);

		HttpHeaders headers = serverHttpRequest.getHeaders();
		ExHttpHeaders exHttpHeaders = httpHeadersParser.parse(headers);
		exServerHttpRequest.setHeaders(exHttpHeaders);

		String id = serverHttpRequest.getId();
		exServerHttpRequest.setId(id);

		HttpMethod method = serverHttpRequest.getMethod();
		ExHttpMethod exHttpMethod = httpMethodParser.parse(method);
		exServerHttpRequest.setMethod(exHttpMethod);

		String methodValue = serverHttpRequest.getMethodValue();
		exServerHttpRequest.setMethodValue(methodValue);

		RequestPath path = serverHttpRequest.getPath();
		ExRequestPath exRequestPath = requestPathParser.parse(path);
		exServerHttpRequest.setPath(exRequestPath);

		MultiValueMap queryParams = serverHttpRequest.getQueryParams();
		ExMultiValueMap exQueryParams = multiValueMapParser.parse(queryParams);
		exServerHttpRequest.setQueryParams(exQueryParams);

		InetSocketAddress remoteAddress = serverHttpRequest.getRemoteAddress();
		ExInetSocketAddress exInetSocketAddress = inetSocketAddressParser.parse(remoteAddress);
		exServerHttpRequest.setRemoteAddress(exInetSocketAddress);

		SslInfo sslInfo = serverHttpRequest.getSslInfo();
		ExSslInfo exSslInfo = sslInfoParser.parse(sslInfo);
		exServerHttpRequest.setSslInfo(exSslInfo);

		URI uri = serverHttpRequest.getURI();
		ExURI exURI = uriParser.parse(uri);
		exServerHttpRequest.setUri(exURI);
	}

	public Mono parse(ServerHttpRequest serverHttpRequest) {

		log.trace("parse -> (serverHttpRequest) {}", serverHttpRequest);
		ExServerHttpRequest exServerHttpRequest = new ExServerHttpRequest();

		if (null == serverHttpRequest) {
			return Mono.just(exServerHttpRequest);
		} else {
			ExBase exBase = objectParser.parse(serverHttpRequest);
			exServerHttpRequest = new ExServerHttpRequest(exBase);

			parseSyncState(serverHttpRequest, exServerHttpRequest);
			return parseAsyncState(serverHttpRequest, exServerHttpRequest);
		}
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy