package ddth.dasp.hetty.front; import java.util.Map.Entry; import org.apache.commons.lang3.StringUtils; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; import org.jboss.netty.handler.codec.http.CookieEncoder; import org.jboss.netty.handler.codec.http.DefaultCookie; import org.jboss.netty.handler.codec.http.DefaultHttpResponse; import org.jboss.netty.handler.codec.http.HttpResponse; import org.jboss.netty.handler.codec.http.HttpResponseStatus; import org.jboss.netty.handler.codec.http.HttpVersion; import org.jboss.netty.util.CharsetUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ddth.dasp.hetty.HettyConstants; import ddth.dasp.hetty.message.ICookie; import ddth.dasp.hetty.message.IResponse; import ddth.dasp.hetty.utils.HettyUtils; public abstract class AbstractHettyResponseService implements IHettyResponseService { private final static Logger LOGGER = LoggerFactory .getLogger(AbstractHettyResponseService.class); /** * {@inheritDoc} */ @Override public void writeResponse(IResponse response) { Integer channelId = response.getChannelId(); Channel channel = HettyUtils.ALL_CHANNELS.find(channelId); Object requestId = HettyUtils.getChannelLocalAttribute(channel, HettyConstants.CHA_REQUEST_ID); if (channel != null && response.getRequestId().equals(requestId)) { HttpResponseStatus status = HttpResponseStatus.valueOf(response.getStatus()); HttpResponse httpResponse = new DefaultHttpResponse(HttpVersion.HTTP_1_1, status != null ? status : HttpResponseStatus.OK); // headers for (Entry<String, String> header : response.getHeaders().entrySet()) { httpResponse.addHeader(header.getKey(), header.getValue()); } // cookies ICookie[] cookies = response.getCookies(); if (cookies.length > 0) { CookieEncoder cookieEncoder = new CookieEncoder(false); for (ICookie cookie : cookies) { DefaultCookie nettyCookie = new DefaultCookie(cookie.getName(), cookie.getValue()); if (!StringUtils.isBlank(cookie.getDomain())) { nettyCookie.setDomain(cookie.getDomain()); } if (!StringUtils.isBlank(cookie.getPath())) { nettyCookie.setDomain(cookie.getPath()); } if (cookie.getPort() > 0) { nettyCookie.setPorts(cookie.getPort()); } if (cookie.getMaxAge() > 0) { nettyCookie.setMaxAge(cookie.getMaxAge()); } cookieEncoder.addCookie(nettyCookie); } httpResponse.setHeader("Cookie", cookieEncoder.encode()); } if (response.getContent() != null) { httpResponse.setContent(ChannelBuffers.copiedBuffer(response.getContent())); } else { httpResponse.setContent(ChannelBuffers.copiedBuffer("", CharsetUtil.UTF_8)); } HettyUtils.writeResponse(channel, httpResponse); if (LOGGER.isDebugEnabled()) { long timestamp = System.nanoTime(); StringBuilder logMsg = new StringBuilder(response.getRequestId()).append("/") .append(response.getStatus()).append("/") .append((timestamp - response.getRequestTimestampNano()) / 1E6) .append(" ms"); LOGGER.debug(logMsg.toString()); } } } }