下面列出了 io.netty.handler.codec.http2.Http2FrameLogger #io.netty.handler.codec.http.cookie.ServerCookieDecoder 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private String extractFromCookies(String cookieHeader) {
// look for auth cookie
if(cookieHeader == null) {
return null;
}
String sessionId = null;
logger.trace("Found cookies: value = {}", cookieHeader);
Set<Cookie> cookies = ServerCookieDecoder.STRICT.decode(cookieHeader);
for (Cookie cookie : cookies) {
if (cookieConfig.getAuthCookieName().equals(cookie.name())) {
logger.trace("Found {} cookie: value = {}", cookieConfig.getAuthCookieName(), cookie.value());
sessionId = cookie.value();
if (StringUtils.isNotEmpty(sessionId)) {
logger.trace("Token {} found in {} cookie.", sessionId, cookieConfig.getAuthCookieName());
} else {
sessionId = null;
}
}
}
return sessionId;
}
private String extractFromCookies(String cookieHeader) {
// look for auth cookie
if(cookieHeader == null) {
return null;
}
String sessionId = null;
logger.trace("Found cookies: value = {}", cookieHeader);
Set<Cookie> cookies = ServerCookieDecoder.STRICT.decode(cookieHeader);
for (Cookie cookie : cookies) {
if (cookieConfig.getAuthCookieName().equals(cookie.name())) {
logger.trace("Found {} cookie: value = {}", cookieConfig.getAuthCookieName(), cookie.value());
sessionId = cookie.value();
if (StringUtils.isNotEmpty(sessionId)) {
logger.trace("Token {} found in {} cookie.", sessionId, cookieConfig.getAuthCookieName());
} else {
sessionId = null;
}
}
}
return sessionId;
}
protected void captureRequestCookies(HttpRequest httpRequest) {
String cookieHeader = httpRequest.headers().get(HttpHeaders.Names.COOKIE);
if (cookieHeader == null) {
return;
}
Set<Cookie> cookies = ServerCookieDecoder.LAX.decode(cookieHeader);
for (Cookie cookie : cookies) {
HarCookie harCookie = new HarCookie();
harCookie.setName(cookie.name());
harCookie.setValue(cookie.value());
harEntry.getRequest().getCookies().add(harCookie);
}
}
/**
* 从cookie中得到Session Id
* @return
*/
private String getJSessionId(FullHttpRequest request) {
try {
String cookieStr = request.headers().get("Cookie");
if(cookieStr == null || cookieStr.trim().isEmpty()) {
return null;
}
Set<Cookie> cookies = ServerCookieDecoder.STRICT.decode(cookieStr);
Iterator<Cookie> it = cookies.iterator();
while (it.hasNext()) {
Cookie cookie = it.next();
if (cookie.name().equals(CacheKeys.JSESSIONID)) {
if (CacheManagerFactory.getCacheManager().get(cookie.value()) != null) {
return cookie.value();
}
}
}
} catch (Exception e1) {
return null;
}
return null;
}
/**
* 从cookie中得到Session Id
* @param request
* @return
*/
private String getJSessionId(FullHttpRequest request) {
try {
String cookieStr = request.headers().get("Cookie");
if(cookieStr == null || cookieStr.trim().isEmpty()) {
return null;
}
Set<Cookie> cookies = ServerCookieDecoder.STRICT.decode(cookieStr);
Iterator<Cookie> it = cookies.iterator();
while (it.hasNext()) {
Cookie cookie = it.next();
if (cookie.name().equals(CacheKeys.JSESSIONID)) {
if (CacheManagerFactory.getCacheManager().get(cookie.value()) != null) {
return cookie.value();
}
}
}
} catch (Exception e1) {
return null;
}
return null;
}
@Test
public void shouldTransformStyxRequestToNettyRequestWithAllRelevantInformation() {
LiveHttpRequest request = new LiveHttpRequest.Builder()
.method(GET)
.header("X-Forwarded-Proto", "https")
.cookies(
requestCookie("HASESSION_V3", "asdasdasd"),
requestCookie("has", "123456789")
)
.uri("https://www.example.com/foo%2Cbar?foo,baf=2")
.build();
DefaultHttpRequest nettyRequest = HttpRequestOperation.toNettyRequest(request);
assertThat(nettyRequest.method(), is(io.netty.handler.codec.http.HttpMethod.GET));
assertThat(nettyRequest.uri(), is("https://www.example.com/foo%2Cbar?foo%2Cbaf=2"));
assertThat(nettyRequest.headers().get("X-Forwarded-Proto"), is("https"));
assertThat(ServerCookieDecoder.LAX.decode(nettyRequest.headers().get("Cookie")),
containsInAnyOrder(
new DefaultCookie("HASESSION_V3", "asdasdasd"),
new DefaultCookie("has", "123456789")));
}
public static String getSessionId(FullHttpRequest msg, boolean anonymousAccessAllowed) {
final StringBuilder buf = new StringBuilder();
msg.headers().getAll(HttpHeaderNames.COOKIE).forEach(h -> {
ServerCookieDecoder.STRICT.decode(h).forEach(c -> {
if (c.name().equals(Constants.COOKIE_NAME)) {
if (buf.length() == 0) {
buf.append(c.value());
}
}
});
});
String sessionId = buf.toString();
if (sessionId.length() == 0 && anonymousAccessAllowed) {
sessionId = NO_AUTHORIZATIONS;
} else if (sessionId.length() == 0) {
sessionId = null;
}
return sessionId;
}
public static String getSessionId(FullHttpRequest msg) {
Multimap<String, String> headers = HttpHeaderUtils.toMultimap(msg.headers());
Collection<String> cookies = headers.get(HttpHeaderNames.COOKIE.toString());
final StringBuilder buf = new StringBuilder();
cookies.forEach(h -> {
ServerCookieDecoder.STRICT.decode(h).forEach(c -> {
if (c.name().equals(Constants.COOKIE_NAME)) {
if (buf.length() == 0) {
buf.append(c.value());
}
}
});
});
if (buf.length() == 0) {
return null;
} else {
return buf.toString();
}
}
public static String getSessionId(FullHttpRequest msg) {
Multimap<String, String> headers = HttpHeaderUtils.toMultimap(msg.headers());
Collection<String> cookies = headers.get(HttpHeaderNames.COOKIE.toString());
final StringBuilder buf = new StringBuilder();
cookies.forEach(h -> {
ServerCookieDecoder.STRICT.decode(h).forEach(c -> {
if (c.name().equals(Constants.COOKIE_NAME)) {
if (buf.length() == 0) {
buf.append(c.value());
}
}
});
});
if (buf.length() == 0) {
return null;
} else {
return buf.toString();
}
}
public static @NotNull Set<Cookie> extractCookies(@Nullable HttpRequest request) {
if (request == null) {
return Collections.emptySet();
}
HttpHeaders trailingHeaders = extractTrailingHeadersIfPossible(request);
String cookieString = request.headers().get(COOKIE);
if (cookieString == null && trailingHeaders != null) {
cookieString = trailingHeaders.get(COOKIE);
}
if (cookieString != null) {
return new HashSet<>(ServerCookieDecoder.LAX.decode(cookieString));
}
return Collections.emptySet();
}
public static HttpResponse createServerDefault(String requestCookie) {
HttpResponse ret = new HttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, Unpooled.buffer());
ret.headers().set(HttpHeaderNames.CONTENT_TYPE, "application/json; charset=UTF-8");
if (requestCookie == null) { return ret; }
Set<Cookie> cookies = ServerCookieDecoder.STRICT.decode(requestCookie);
if (cookies.isEmpty()) { return ret; }
// Reset the cookies if necessary.
for (Cookie cookie : cookies) {
ret.headers().add(HttpHeaderNames.SET_COOKIE, ClientCookieEncoder.STRICT.encode(cookie));
}
return ret;
}
protected void captureRequestCookies(HttpRequest httpRequest) {
Log.e("InnerHandle", "captureRequestCookies " + harEntry.getId());
String cookieHeader = httpRequest.headers().get(HttpHeaders.Names.COOKIE);
if (cookieHeader == null) {
return;
}
Set<Cookie> cookies = ServerCookieDecoder.LAX.decode(cookieHeader);
for (Cookie cookie : cookies) {
HarCookie harCookie = new HarCookie();
harCookie.setName(cookie.name());
harCookie.setValue(cookie.value());
harRequest.getRequest().getCookies().add(harCookie);
harRequest.addHeader(cookie.name(), cookie.value());
}
}
static void addStreamHandlers(Channel ch, ChannelOperations.OnSetup opsFactory,
ConnectionObserver listener, boolean readForwardHeaders,
ServerCookieEncoder encoder, ServerCookieDecoder decoder) {
if (ACCESS_LOG) {
ch.pipeline()
.addLast(NettyPipeline.AccessLogHandler, new AccessLogHandlerH2());
}
ch.pipeline()
.addLast(NettyPipeline.H2ToHttp11Codec, new Http2StreamFrameToHttpObjectCodec(true))
.addLast(NettyPipeline.HttpTrafficHandler,
new Http2StreamBridgeServerHandler(listener, readForwardHeaders, encoder, decoder));
ChannelOperations.addReactiveBridge(ch, opsFactory, listener);
if (log.isDebugEnabled()) {
log.debug(format(ch, "Initialized HTTP/2 stream pipeline {}"), ch.pipeline());
}
}
static void configureH2Pipeline(ChannelPipeline p,
ServerCookieDecoder cookieDecoder,
ServerCookieEncoder cookieEncoder,
boolean forwarded,
Http2Settings http2Settings,
ConnectionObserver listener,
ChannelOperations.OnSetup opsFactory,
boolean validate) {
p.remove(NettyPipeline.ReactiveBridge);
Http2FrameCodecBuilder http2FrameCodecBuilder =
Http2FrameCodecBuilder.forServer()
.validateHeaders(validate)
.initialSettings(http2Settings);
if (p.get(NettyPipeline.LoggingHandler) != null) {
http2FrameCodecBuilder.frameLogger(new Http2FrameLogger(LogLevel.DEBUG,
"reactor.netty.http.server.h2"));
}
p.addLast(NettyPipeline.HttpCodec, http2FrameCodecBuilder.build())
.addLast(NettyPipeline.H2MultiplexHandler,
new Http2MultiplexHandler(new H2Codec(opsFactory, listener, forwarded, cookieEncoder, cookieDecoder)));
}
Http11OrH2CleartextCodec(
ServerCookieDecoder cookieDecoder,
ServerCookieEncoder cookieEncoder,
boolean debug,
boolean forwarded,
Http2Settings http2Settings,
ConnectionObserver listener,
ChannelOperations.OnSetup opsFactory,
boolean validate) {
this.cookieDecoder = cookieDecoder;
this.cookieEncoder = cookieEncoder;
this.forwarded = forwarded;
Http2FrameCodecBuilder http2FrameCodecBuilder =
Http2FrameCodecBuilder.forServer()
.validateHeaders(validate)
.initialSettings(http2Settings);
if (debug) {
http2FrameCodecBuilder.frameLogger(new Http2FrameLogger(
LogLevel.DEBUG,
"reactor.netty.http.server.h2"));
}
this.http2FrameCodec = http2FrameCodecBuilder.build();
this.listener = listener;
this.opsFactory = opsFactory;
}
H2OrHttp11Codec(
@Nullable BiPredicate<HttpServerRequest, HttpServerResponse> compressPredicate,
ServerCookieDecoder cookieDecoder,
ServerCookieEncoder cookieEncoder,
HttpRequestDecoderSpec decoder,
boolean forwarded,
Http2Settings http2Settings,
ConnectionObserver listener,
@Nullable Supplier<? extends ChannelMetricsRecorder> metricsRecorder,
int minCompressionSize,
ChannelOperations.OnSetup opsFactory,
@Nullable Function<String, String> uriTagValue) {
super(ApplicationProtocolNames.HTTP_1_1);
this.compressPredicate = compressPredicate;
this.cookieDecoder = cookieDecoder;
this.cookieEncoder = cookieEncoder;
this.decoder = decoder;
this.forwarded = forwarded;
this.http2Settings = http2Settings;
this.listener = listener;
this.metricsRecorder = metricsRecorder;
this.minCompressionSize = minCompressionSize;
this.opsFactory = opsFactory;
this.uriTagValue = uriTagValue;
}
HttpServerOperations(Connection c,
ConnectionObserver listener,
@Nullable BiPredicate<HttpServerRequest, HttpServerResponse> compressionPredicate,
HttpRequest nettyRequest,
@Nullable ConnectionInfo connectionInfo,
ServerCookieEncoder encoder,
ServerCookieDecoder decoder) {
super(c, listener);
this.nettyRequest = nettyRequest;
this.path = resolvePath(nettyRequest.uri());
this.nettyResponse = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
this.responseHeaders = nettyResponse.headers();
this.responseHeaders.set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);
this.compressionPredicate = compressionPredicate;
this.cookieHolder = Cookies.newServerRequestHolder(requestHeaders(), decoder);
this.connectionInfo = connectionInfo;
this.cookieEncoder = encoder;
this.cookieDecoder = decoder;
}
@SuppressWarnings("FutureReturnValueIgnored")
private void doTestStatus(HttpResponseStatus status) {
EmbeddedChannel channel = new EmbeddedChannel();
HttpServerOperations ops = new HttpServerOperations(
Connection.from(channel),
ConnectionObserver.emptyListener(),
null,
new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/"),
null,
ServerCookieEncoder.STRICT,
ServerCookieDecoder.STRICT);
ops.status(status);
HttpMessage response = ops.newFullBodyMessage(Unpooled.EMPTY_BUFFER);
assertThat(((FullHttpResponse) response).status().reasonPhrase()).isEqualTo(status.reasonPhrase());
// "FutureReturnValueIgnored" is suppressed deliberately
channel.close();
}
protected void captureRequestCookies(HttpRequest httpRequest) {
String cookieHeader = httpRequest.headers().get(HttpHeaders.Names.COOKIE);
if (cookieHeader == null) {
return;
}
Set<Cookie> cookies = ServerCookieDecoder.LAX.decode(cookieHeader);
for (Cookie cookie : cookies) {
HarCookie harCookie = new HarCookie();
harCookie.setName(cookie.name());
harCookie.setValue(cookie.value());
harEntry.getRequest().getCookies().add(harCookie);
}
}
public User getUserFromCookie(FullHttpRequest request) {
String cookieString = request.headers().get(HttpHeaderNames.COOKIE);
if (cookieString != null) {
Set<Cookie> cookies = ServerCookieDecoder.STRICT.decode(cookieString);
if (!cookies.isEmpty()) {
for (Cookie cookie : cookies) {
if (isValid(cookie)) {
String token = cookie.value();
return httpSession.get(token);
}
}
}
}
return null;
}
public static Collection<Cookie> getCookies(String name,
HttpRequest request) {
String cookieString = request.headers().get(COOKIE);
if (cookieString != null) {
List<Cookie> foundCookie = new ArrayList<>();
Set<Cookie> cookies = ServerCookieDecoder.STRICT.decode(cookieString);
for (Cookie cookie : cookies) {
if (cookie.name().equals(name)) {
foundCookie.add(cookie);
}
}
return foundCookie;
}
return null;
}
public void init(Channel channel, FullHttpRequest request, RouteResult<RouteAction> routeResult, boolean enableCookies) {
this.channel = channel;
this.request = request;
this.routeResult = routeResult;
this.enableCookies = enableCookies;
if (this.method() == HttpMethod.POST) {
try {
HttpPostRequestDecoder decoder = new HttpPostRequestDecoder(request);
decoder.offer(request);
List<InterfaceHttpData> paramsList = decoder.getBodyHttpDatas();
for (InterfaceHttpData httpData : paramsList) {
if (httpData.getHttpDataType() == HttpDataType.Attribute) {
Attribute data = (Attribute) httpData;
postMaps.put(data.getName(), data.getValue());
} else if (httpData.getHttpDataType() == HttpDataType.FileUpload) {
MixedFileUpload fileUpload = (MixedFileUpload) httpData;
this.fileUpload = fileUpload;
} else {
LOGGER.error("not support http data type. type={}", httpData.getHttpDataType());
}
}
} catch (Exception ex) {
LOGGER.error("{}", ex);
}
}
if (enableCookies) {
List<String> cookiesList = request.headers().getAll(HttpHeaderNames.COOKIE);
cookiesList.forEach(h -> ServerCookieDecoder.STRICT.decode(h).forEach(c -> cookieMaps.put(c.name(), c)));
}
}
protected void captureRequestCookies(HttpRequest httpRequest) {
String cookieHeader = httpRequest.headers().get(HttpHeaderNames.COOKIE);
if (cookieHeader == null) {
return;
}
Set<Cookie> cookies = ServerCookieDecoder.LAX.decode(cookieHeader);
cookies.forEach(cookie -> {
HarCookie harCookie = new HarCookie();
harCookie.setName(cookie.name());
harCookie.setValue(cookie.value());
harEntry.getRequest().getCookies().add(harCookie);
});
}
private boolean writeResponse(HttpObject currentObj, ChannelHandlerContext ctx) {
// Decide whether to close the connection or not.
boolean keepAlive = HttpUtil.isKeepAlive(request);
// Build the response object.
FullHttpResponse response = new DefaultFullHttpResponse(
HTTP_1_1, currentObj.decoderResult().isSuccess()? OK : BAD_REQUEST,
Unpooled.copiedBuffer(buf.toString(), CharsetUtil.UTF_8));
response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8");
if (keepAlive) {
// Add 'Content-Length' header only for a keep-alive connection.
response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
// Add keep alive header as per:
// - http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Connection
response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
}
// Encode the cookie.
String cookieString = request.headers().get(HttpHeaderNames.COOKIE);
if (cookieString != null) {
Set<Cookie> cookies = ServerCookieDecoder.STRICT.decode(cookieString);
if (!cookies.isEmpty()) {
// Reset the cookies if necessary.
for (Cookie cookie: cookies) {
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.STRICT.encode(cookie));
}
}
} else {
// Browser sent no cookie. Add some.
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.STRICT.encode("key1", "value1"));
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.STRICT.encode("key2", "value2"));
}
// Write the response.
ctx.write(response);
return keepAlive;
}
private boolean writeResponse(HttpObject currentObj, ChannelHandlerContext ctx) {
// 用以判断是否要关闭链接.
boolean keepAlive = HttpUtil.isKeepAlive(request);
// 构建Respons对象.
FullHttpResponse response = new DefaultFullHttpResponse(
HTTP_1_1, currentObj.decoderResult().isSuccess()? OK : BAD_REQUEST,
Unpooled.copiedBuffer(buf.toString(), CharsetUtil.UTF_8));
response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8");
if (keepAlive) {
// 只为keep-alive 链接增加 'Content-Length' 头.
response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
// 根据以下规范增加 keep alive header a头:
// - http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Connection
response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
}
// 编码 cookie.
String cookieString = request.headers().get(HttpHeaderNames.COOKIE);
if (cookieString != null) {
Set<Cookie> cookies = ServerCookieDecoder.STRICT.decode(cookieString);
if (!cookies.isEmpty()) {
// 重置cookie.
for (Cookie cookie: cookies) {
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.STRICT.encode(cookie));
}
}
} else {
// 为浏览器添加一些cookie.
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.STRICT.encode("key1", "value1"));
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.STRICT.encode("key2", "value2"));
}
// 发送响应内容.
ctx.write(response);
return keepAlive;
}
@Override
public ai.houyi.dorado.rest.http.Cookie[] getCookies() {
String cookieString = this.request.headers().get(HttpHeaderNames.COOKIE);
if (cookieString != null) {
Set<Cookie> cookies = ServerCookieDecoder.LAX.decode(cookieString);
return cookies.stream().map(cookie -> new CookieImpl(cookie)).collect(Collectors.toList())
.toArray(new CookieImpl[] {});
}
return null;
}
HashMap<String, String> decodeCookie() {
String cookie = getHeader("cookie");
if (cookie != null && !cookie.isEmpty()) {
Set<Cookie> decoded = ServerCookieDecoder.STRICT.decode(cookie);
if (decoded != null && decoded.size() > 0) {
HashMap<String, String> m = new HashMap<String, String>();
for (Cookie c : decoded) {
m.put(c.name(), c.value());
}
return m;
}
}
return new HashMap<String, String>();
}
@Override
public Set<Cookie> getCookies() {
HttpRequest request = RedantContext.currentContext().getRequest();
Set<Cookie> cookies = new HashSet<>();
if (request != null) {
String value = request.headers().get(HttpHeaderNames.COOKIE);
if (value != null) {
cookies = ServerCookieDecoder.STRICT.decode(value);
}
}
return cookies;
}
/**
* 解析request中的Cookie到本类的cookies数组中
*
* @author Leibniz
*/
private void parseCookie() {
if (isCookieParsed) {
return;
}
String cookieOriginStr = this.headers.get("Cookie");
if (cookieOriginStr == null) {
return;
}
Set<io.netty.handler.codec.http.cookie.Cookie> nettyCookies = ServerCookieDecoder.LAX.decode(cookieOriginStr);
if (nettyCookies.size() == 0) {
return;
}
this.cookies = new Cookie[nettyCookies.size()];
Iterator<io.netty.handler.codec.http.cookie.Cookie> itr = nettyCookies.iterator();
int i = 0;
while (itr.hasNext()) {
io.netty.handler.codec.http.cookie.Cookie nettyCookie = itr.next();
Cookie servletCookie = new Cookie(nettyCookie.name(), nettyCookie.value());
// servletCookie.setMaxAge(Ints.checkedCast(nettyCookie.maxAge()));
if(nettyCookie.domain() != null) servletCookie.setDomain(nettyCookie.domain());
if(nettyCookie.path() != null) servletCookie.setPath(nettyCookie.path());
servletCookie.setHttpOnly(nettyCookie.isHttpOnly());
this.cookies[i++] = servletCookie;
}
this.isCookieParsed = true;
}
private boolean writeResponse(HttpObject currentObj, ChannelHandlerContext ctx) {
// Decide whether to close the connection or not.
boolean keepAlive = HttpUtil.isKeepAlive(request);
// Build the response object.
FullHttpResponse response = new DefaultFullHttpResponse(
HTTP_1_1, currentObj.decoderResult().isSuccess()? OK : BAD_REQUEST,
Unpooled.copiedBuffer(buf.toString(), CharsetUtil.UTF_8));
response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8");
if (keepAlive) {
// Add 'Content-Length' header only for a keep-alive connection.
response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
// Add keep alive header as per:
// - http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Connection
response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
}
// Encode the cookie.
String cookieString = request.headers().get(HttpHeaderNames.COOKIE);
if (cookieString != null) {
Set<Cookie> cookies = ServerCookieDecoder.STRICT.decode(cookieString);
if (!cookies.isEmpty()) {
// Reset the cookies if necessary.
for (Cookie cookie: cookies) {
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.STRICT.encode(cookie));
}
}
} else {
// Browser sent no cookie. Add some.
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.STRICT.encode("key1", "value1"));
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.STRICT.encode("key2", "value2"));
}
// Write the response.
ctx.write(response);
return keepAlive;
}