parent
de8ad5ffaa
commit
b5008bad32
@ -0,0 +1,154 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2013-2017 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.gitee.sop.gatewaycommon.gateway.common; |
||||||
|
|
||||||
|
import org.springframework.core.io.InputStreamResource; |
||||||
|
import org.springframework.http.HttpEntity; |
||||||
|
import org.springframework.http.HttpHeaders; |
||||||
|
import org.springframework.http.MediaType; |
||||||
|
import org.springframework.util.LinkedMultiValueMap; |
||||||
|
import org.springframework.util.MultiValueMap; |
||||||
|
import org.springframework.web.multipart.MultipartFile; |
||||||
|
import org.springframework.web.multipart.MultipartHttpServletRequest; |
||||||
|
import org.springframework.web.util.UriComponentsBuilder; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import java.io.IOException; |
||||||
|
import java.nio.charset.Charset; |
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Map.Entry; |
||||||
|
import java.util.Set; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
|
||||||
|
import static java.util.Arrays.stream; |
||||||
|
import static java.util.Collections.emptyMap; |
||||||
|
import static org.springframework.util.StringUtils.isEmpty; |
||||||
|
import static org.springframework.util.StringUtils.tokenizeToStringArray; |
||||||
|
import static org.springframework.util.StringUtils.uriDecode; |
||||||
|
|
||||||
|
public class RequestContentDataExtractor { |
||||||
|
public static MultiValueMap<String, Object> extract(HttpServletRequest request) throws IOException { |
||||||
|
return (request instanceof MultipartHttpServletRequest) ? |
||||||
|
extractFromMultipartRequest((MultipartHttpServletRequest) request) : |
||||||
|
extractFromRequest(request); |
||||||
|
} |
||||||
|
|
||||||
|
private static MultiValueMap<String, Object> extractFromRequest(HttpServletRequest request) throws IOException { |
||||||
|
MultiValueMap<String, Object> builder = new LinkedMultiValueMap<>(); |
||||||
|
Set<String> queryParams = findQueryParams(request); |
||||||
|
|
||||||
|
for (Entry<String, String[]> entry : request.getParameterMap().entrySet()) { |
||||||
|
String key = entry.getKey(); |
||||||
|
|
||||||
|
if (!queryParams.contains(key) && entry.getValue() != null) { |
||||||
|
for (String value : entry.getValue()) { |
||||||
|
builder.add(key, value); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return builder; |
||||||
|
} |
||||||
|
|
||||||
|
private static MultiValueMap<String, Object> extractFromMultipartRequest(MultipartHttpServletRequest request) |
||||||
|
throws IOException { |
||||||
|
MultiValueMap<String, Object> builder = new LinkedMultiValueMap<>(); |
||||||
|
Map<String, List<String>> queryParamsGroupedByName = findQueryParamsGroupedByName( |
||||||
|
request); |
||||||
|
Set<String> queryParams = findQueryParams(request); |
||||||
|
|
||||||
|
for (Entry<String, String[]> entry : request.getParameterMap().entrySet()) { |
||||||
|
String key = entry.getKey(); |
||||||
|
List<String> listOfAllParams = stream(request.getParameterMap().get(key)) |
||||||
|
.collect(Collectors.toList()); |
||||||
|
List<String> listOfOnlyQueryParams = queryParamsGroupedByName.get(key); |
||||||
|
|
||||||
|
if(listOfOnlyQueryParams != null) { |
||||||
|
listOfOnlyQueryParams = listOfOnlyQueryParams.stream() |
||||||
|
.map(param -> uriDecode(param, Charset.defaultCharset())) |
||||||
|
.collect(Collectors.toList()); |
||||||
|
if (!listOfOnlyQueryParams.containsAll(listOfAllParams)) { |
||||||
|
listOfAllParams.removeAll(listOfOnlyQueryParams); |
||||||
|
for (String value : listOfAllParams) { |
||||||
|
builder.add(key, |
||||||
|
new HttpEntity<>(value, newHttpHeaders(request, key))); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!queryParams.contains(key)) { |
||||||
|
for (String value : entry.getValue()) { |
||||||
|
builder.add(key, |
||||||
|
new HttpEntity<>(value, newHttpHeaders(request, key))); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
for (Entry<String, List<MultipartFile>> parts : request.getMultiFileMap().entrySet()) { |
||||||
|
for (MultipartFile file : parts.getValue()) { |
||||||
|
HttpHeaders headers = new HttpHeaders(); |
||||||
|
headers.setContentDispositionFormData(file.getName(), file.getOriginalFilename()); |
||||||
|
if (file.getContentType() != null) { |
||||||
|
headers.setContentType(MediaType.valueOf(file.getContentType())); |
||||||
|
} |
||||||
|
|
||||||
|
HttpEntity entity = new HttpEntity<>(new InputStreamResource(file.getInputStream()), headers); |
||||||
|
builder.add(parts.getKey(), entity); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return builder; |
||||||
|
} |
||||||
|
|
||||||
|
private static HttpHeaders newHttpHeaders(MultipartHttpServletRequest request, |
||||||
|
String key) { |
||||||
|
HttpHeaders headers = new HttpHeaders(); |
||||||
|
String type = request.getMultipartContentType(key); |
||||||
|
|
||||||
|
if (type != null) { |
||||||
|
headers.setContentType(MediaType.valueOf(type)); |
||||||
|
} |
||||||
|
return headers; |
||||||
|
} |
||||||
|
|
||||||
|
private static Set<String> findQueryParams(HttpServletRequest request) { |
||||||
|
Set<String> result = new HashSet<>(); |
||||||
|
String query = request.getQueryString(); |
||||||
|
|
||||||
|
if (query != null) { |
||||||
|
for (String value : tokenizeToStringArray(query, "&")) { |
||||||
|
if (value.contains("=")) { |
||||||
|
value = value.substring(0, value.indexOf("=")); |
||||||
|
} |
||||||
|
result.add(value); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
static Map<String, List<String>> findQueryParamsGroupedByName( |
||||||
|
HttpServletRequest request) { |
||||||
|
String query = request.getQueryString(); |
||||||
|
if (isEmpty(query)) { |
||||||
|
return emptyMap(); |
||||||
|
} |
||||||
|
return UriComponentsBuilder.fromUriString("?" + query).build().getQueryParams(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
package com.gitee.sop.gatewaycommon.param; |
||||||
|
|
||||||
|
import org.springframework.http.HttpHeaders; |
||||||
|
import org.springframework.http.HttpOutputMessage; |
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.OutputStream; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author tanghc |
||||||
|
*/ |
||||||
|
public class FormHttpOutputMessage implements HttpOutputMessage { |
||||||
|
|
||||||
|
private HttpHeaders headers = new HttpHeaders(); |
||||||
|
private ByteArrayOutputStream output = new ByteArrayOutputStream(); |
||||||
|
|
||||||
|
@Override |
||||||
|
public HttpHeaders getHeaders() { |
||||||
|
return this.headers; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public OutputStream getBody() throws IOException { |
||||||
|
return this.output; |
||||||
|
} |
||||||
|
|
||||||
|
public byte[] getInput() throws IOException { |
||||||
|
this.output.flush(); |
||||||
|
return this.output.toByteArray(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue