-
Notifications
You must be signed in to change notification settings - Fork 198
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
1,676 additions
and
1,625 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
389 changes: 178 additions & 211 deletions
389
bboss-mvc/src/org/frameworkset/http/ServletServerHttpRequest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,211 +1,178 @@ | ||
/* | ||
* Copyright 2008-2010 biaoping.yin | ||
* | ||
* 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 org.frameworkset.http; | ||
|
||
import com.frameworkset.util.StringUtil; | ||
import org.frameworkset.util.Assert; | ||
import org.frameworkset.util.LinkedCaseInsensitiveMap; | ||
import org.frameworkset.util.annotations.HttpMethod; | ||
|
||
import javax.servlet.http.HttpServletRequest; | ||
import java.io.*; | ||
import java.net.InetSocketAddress; | ||
import java.net.URI; | ||
import java.net.URISyntaxException; | ||
import java.net.URLEncoder; | ||
import java.nio.charset.Charset; | ||
import java.security.Principal; | ||
import java.util.*; | ||
|
||
/** | ||
* <p>Title: ServletServerHttpRequest.java</p> | ||
* <p>Description: </p> | ||
* <p>bboss workgroup</p> | ||
* <p>Copyright (c) 2008</p> | ||
* @Date 2010-11-21 | ||
* @author biaoping.yin | ||
* @version 1.0 | ||
*/ | ||
public class ServletServerHttpRequest implements ServerHttpRequest { | ||
|
||
protected static final String FORM_CONTENT_TYPE = "application/x-www-form-urlencoded"; | ||
|
||
protected static final String FORM_CHARSET = "UTF-8"; | ||
|
||
|
||
private final HttpServletRequest servletRequest; | ||
|
||
private HttpHeaders headers; | ||
|
||
private ServerHttpAsyncRequestControl asyncRequestControl; | ||
|
||
|
||
/** | ||
* Construct a new instance of the ServletServerHttpRequest based on the given {@link HttpServletRequest}. | ||
* @param servletRequest the servlet request | ||
*/ | ||
public ServletServerHttpRequest(HttpServletRequest servletRequest) { | ||
Assert.notNull(servletRequest, "HttpServletRequest must not be null"); | ||
this.servletRequest = servletRequest; | ||
} | ||
|
||
|
||
/** | ||
* Returns the {@code HttpServletRequest} this object is based on. | ||
*/ | ||
public HttpServletRequest getServletRequest() { | ||
return this.servletRequest; | ||
} | ||
|
||
@Override | ||
public HttpMethod getMethod() { | ||
return HttpMethod.resolve(this.servletRequest.getMethod()); | ||
} | ||
|
||
@Override | ||
public URI getURI() { | ||
try { | ||
StringBuffer url = this.servletRequest.getRequestURL(); | ||
String query = this.servletRequest.getQueryString(); | ||
if (StringUtil.hasText(query)) { | ||
url.append('?').append(query); | ||
} | ||
return new URI(url.toString()); | ||
} | ||
catch (URISyntaxException ex) { | ||
throw new IllegalStateException("Could not get HttpServletRequest URI: " + ex.getMessage(), ex); | ||
} | ||
} | ||
|
||
@Override | ||
public HttpHeaders getHeaders() { | ||
if (this.headers == null) { | ||
this.headers = new HttpHeaders(); | ||
for (Enumeration<?> headerNames = this.servletRequest.getHeaderNames(); headerNames.hasMoreElements();) { | ||
String headerName = (String) headerNames.nextElement(); | ||
for (Enumeration<?> headerValues = this.servletRequest.getHeaders(headerName); | ||
headerValues.hasMoreElements();) { | ||
String headerValue = (String) headerValues.nextElement(); | ||
this.headers.add(headerName, headerValue); | ||
} | ||
} | ||
// HttpServletRequest exposes some headers as properties: we should include those if not already present | ||
MediaType contentType = this.headers.getContentType(); | ||
if (contentType == null) { | ||
String requestContentType = this.servletRequest.getContentType(); | ||
if (StringUtil.hasLength(requestContentType)) { | ||
contentType = MediaType.parseMediaType(requestContentType); | ||
this.headers.setContentType(contentType); | ||
} | ||
} | ||
if (contentType != null && contentType.getCharSet() == null) { | ||
String requestEncoding = this.servletRequest.getCharacterEncoding(); | ||
if (StringUtil.hasLength(requestEncoding)) { | ||
Charset charSet = Charset.forName(requestEncoding); | ||
Map<String, String> params = new LinkedCaseInsensitiveMap<String>(); | ||
params.putAll(contentType.getParameters()); | ||
params.put("charset", charSet.toString()); | ||
MediaType newContentType = new MediaType(contentType.getType(), contentType.getSubtype(), params); | ||
this.headers.setContentType(newContentType); | ||
} | ||
} | ||
if (this.headers.getContentLength() == -1) { | ||
int requestContentLength = this.servletRequest.getContentLength(); | ||
if (requestContentLength != -1) { | ||
this.headers.setContentLength(requestContentLength); | ||
} | ||
} | ||
} | ||
return this.headers; | ||
} | ||
|
||
@Override | ||
public Principal getPrincipal() { | ||
return this.servletRequest.getUserPrincipal(); | ||
} | ||
|
||
@Override | ||
public InetSocketAddress getLocalAddress() { | ||
return new InetSocketAddress(this.servletRequest.getLocalName(), this.servletRequest.getLocalPort()); | ||
} | ||
|
||
@Override | ||
public InetSocketAddress getRemoteAddress() { | ||
return new InetSocketAddress(this.servletRequest.getRemoteHost(), this.servletRequest.getRemotePort()); | ||
} | ||
|
||
@Override | ||
public InputStream getBody() throws IOException { | ||
if (isFormPost(this.servletRequest)) { | ||
return getBodyFromServletRequestParameters(this.servletRequest); | ||
} | ||
else { | ||
return this.servletRequest.getInputStream(); | ||
} | ||
} | ||
|
||
@Override | ||
public ServerHttpAsyncRequestControl getAsyncRequestControl(ServerHttpResponse response) { | ||
if (this.asyncRequestControl == null) { | ||
Assert.isInstanceOf(ServletServerHttpResponse.class, response); | ||
ServletServerHttpResponse servletServerResponse = (ServletServerHttpResponse) response; | ||
this.asyncRequestControl = new ServletServerHttpAsyncRequestControl(this, servletServerResponse); | ||
} | ||
return this.asyncRequestControl; | ||
} | ||
|
||
|
||
private static boolean isFormPost(HttpServletRequest request) { | ||
String contentType = request.getContentType(); | ||
return (contentType != null && contentType.contains(FORM_CONTENT_TYPE) && | ||
HttpMethod.POST.matches(request.getMethod())); | ||
} | ||
|
||
/** | ||
* Use {@link javax.servlet.ServletRequest#getParameterMap()} to reconstruct the | ||
* body of a form 'POST' providing a predictable outcome as opposed to reading | ||
* from the body, which can fail if any other code has used the ServletRequest | ||
* to access a parameter, thus causing the input stream to be "consumed". | ||
*/ | ||
private static InputStream getBodyFromServletRequestParameters(HttpServletRequest request) throws IOException { | ||
ByteArrayOutputStream bos = new ByteArrayOutputStream(1024); | ||
Writer writer = new OutputStreamWriter(bos, FORM_CHARSET); | ||
|
||
Map<String, String[]> form = request.getParameterMap(); | ||
for (Iterator<String> nameIterator = form.keySet().iterator(); nameIterator.hasNext();) { | ||
String name = nameIterator.next(); | ||
List<String> values = Arrays.asList(form.get(name)); | ||
for (Iterator<String> valueIterator = values.iterator(); valueIterator.hasNext();) { | ||
String value = valueIterator.next(); | ||
writer.write(URLEncoder.encode(name, FORM_CHARSET)); | ||
if (value != null) { | ||
writer.write('='); | ||
writer.write(URLEncoder.encode(value, FORM_CHARSET)); | ||
if (valueIterator.hasNext()) { | ||
writer.write('&'); | ||
} | ||
} | ||
} | ||
if (nameIterator.hasNext()) { | ||
writer.append('&'); | ||
} | ||
} | ||
writer.flush(); | ||
|
||
return new ByteArrayInputStream(bos.toByteArray()); | ||
} | ||
|
||
} | ||
/* | ||
* Copyright 2008-2010 biaoping.yin | ||
* | ||
* 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 org.frameworkset.http; | ||
|
||
import com.frameworkset.util.StringUtil; | ||
import org.frameworkset.util.Assert; | ||
import org.frameworkset.util.annotations.HttpMethod; | ||
|
||
import javax.servlet.http.HttpServletRequest; | ||
import java.io.*; | ||
import java.net.InetSocketAddress; | ||
import java.net.URI; | ||
import java.net.URISyntaxException; | ||
import java.net.URLEncoder; | ||
import java.security.Principal; | ||
import java.util.Arrays; | ||
import java.util.Iterator; | ||
import java.util.List; | ||
import java.util.Map; | ||
|
||
/** | ||
* <p>Title: ServletServerHttpRequest.java</p> | ||
* <p>Description: </p> | ||
* <p>bboss workgroup</p> | ||
* <p>Copyright (c) 2008</p> | ||
* @Date 2010-11-21 | ||
* @author biaoping.yin | ||
* @version 1.0 | ||
*/ | ||
public class ServletServerHttpRequest implements ServerHttpRequest { | ||
|
||
protected static final String FORM_CONTENT_TYPE = "application/x-www-form-urlencoded"; | ||
|
||
protected static final String FORM_CHARSET = "UTF-8"; | ||
|
||
|
||
private final HttpServletRequest servletRequest; | ||
|
||
private HttpHeaders headers; | ||
|
||
private ServerHttpAsyncRequestControl asyncRequestControl; | ||
|
||
|
||
/** | ||
* Construct a new instance of the ServletServerHttpRequest based on the given {@link HttpServletRequest}. | ||
* @param servletRequest the servlet request | ||
*/ | ||
public ServletServerHttpRequest(HttpServletRequest servletRequest) { | ||
Assert.notNull(servletRequest, "HttpServletRequest must not be null"); | ||
this.servletRequest = servletRequest; | ||
} | ||
|
||
|
||
/** | ||
* Returns the {@code HttpServletRequest} this object is based on. | ||
*/ | ||
public HttpServletRequest getServletRequest() { | ||
return this.servletRequest; | ||
} | ||
|
||
@Override | ||
public HttpMethod getMethod() { | ||
return HttpMethod.resolve(this.servletRequest.getMethod()); | ||
} | ||
|
||
@Override | ||
public URI getURI() { | ||
try { | ||
StringBuffer url = this.servletRequest.getRequestURL(); | ||
String query = this.servletRequest.getQueryString(); | ||
if (StringUtil.hasText(query)) { | ||
url.append('?').append(query); | ||
} | ||
return new URI(url.toString()); | ||
} | ||
catch (URISyntaxException ex) { | ||
throw new IllegalStateException("Could not get HttpServletRequest URI: " + ex.getMessage(), ex); | ||
} | ||
} | ||
|
||
@Override | ||
public HttpHeaders getHeaders() { | ||
if (this.headers == null) { | ||
this.headers = RequestHeaderUtil.getHeaders(this.servletRequest); | ||
} | ||
return this.headers; | ||
} | ||
|
||
@Override | ||
public Principal getPrincipal() { | ||
return this.servletRequest.getUserPrincipal(); | ||
} | ||
|
||
@Override | ||
public InetSocketAddress getLocalAddress() { | ||
return new InetSocketAddress(this.servletRequest.getLocalName(), this.servletRequest.getLocalPort()); | ||
} | ||
|
||
@Override | ||
public InetSocketAddress getRemoteAddress() { | ||
return new InetSocketAddress(this.servletRequest.getRemoteHost(), this.servletRequest.getRemotePort()); | ||
} | ||
|
||
@Override | ||
public InputStream getBody() throws IOException { | ||
if (isFormPost(this.servletRequest)) { | ||
return getBodyFromServletRequestParameters(this.servletRequest); | ||
} | ||
else { | ||
return this.servletRequest.getInputStream(); | ||
} | ||
} | ||
|
||
@Override | ||
public ServerHttpAsyncRequestControl getAsyncRequestControl(ServerHttpResponse response) { | ||
if (this.asyncRequestControl == null) { | ||
Assert.isInstanceOf(ServletServerHttpResponse.class, response); | ||
ServletServerHttpResponse servletServerResponse = (ServletServerHttpResponse) response; | ||
this.asyncRequestControl = new ServletServerHttpAsyncRequestControl(this, servletServerResponse); | ||
} | ||
return this.asyncRequestControl; | ||
} | ||
|
||
|
||
private static boolean isFormPost(HttpServletRequest request) { | ||
String contentType = request.getContentType(); | ||
return (contentType != null && contentType.contains(FORM_CONTENT_TYPE) && | ||
HttpMethod.POST.matches(request.getMethod())); | ||
} | ||
|
||
/** | ||
* Use {link javax.servlet.ServletRequest#getParameterMap()} to reconstruct the | ||
* body of a form 'POST' providing a predictable outcome as opposed to reading | ||
* from the body, which can fail if any other code has used the ServletRequest | ||
* to access a parameter, thus causing the input stream to be "consumed". | ||
*/ | ||
private static InputStream getBodyFromServletRequestParameters(HttpServletRequest request) throws IOException { | ||
ByteArrayOutputStream bos = new ByteArrayOutputStream(1024); | ||
Writer writer = new OutputStreamWriter(bos, FORM_CHARSET); | ||
|
||
Map<String, String[]> form = request.getParameterMap(); | ||
for (Iterator<String> nameIterator = form.keySet().iterator(); nameIterator.hasNext();) { | ||
String name = nameIterator.next(); | ||
List<String> values = Arrays.asList(form.get(name)); | ||
for (Iterator<String> valueIterator = values.iterator(); valueIterator.hasNext();) { | ||
String value = valueIterator.next(); | ||
writer.write(URLEncoder.encode(name, FORM_CHARSET)); | ||
if (value != null) { | ||
writer.write('='); | ||
writer.write(URLEncoder.encode(value, FORM_CHARSET)); | ||
if (valueIterator.hasNext()) { | ||
writer.write('&'); | ||
} | ||
} | ||
} | ||
if (nameIterator.hasNext()) { | ||
writer.append('&'); | ||
} | ||
} | ||
writer.flush(); | ||
|
||
return new ByteArrayInputStream(bos.toByteArray()); | ||
} | ||
|
||
} |
Oops, something went wrong.