/*
GNU GENERAL PUBLIC LICENSE
Copyright (C) 2006 The Lobo Project
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
verion 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Contact info: lobochief@users.sourceforge.net
*/
package org.lobobrowser.request;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.CookieHandler;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
public class CookieHandlerImpl extends CookieHandler {
private static final Logger logger = Logger.getLogger(CookieHandlerImpl.class.getName());
private final CookieStore cookieStore = CookieStore.getInstance();
private static void printHeaders(final Map<String, List<String>> headers) {
final StringWriter swriter = new StringWriter();
final PrintWriter writer = new PrintWriter(swriter);
writer.println();
for (final Map.Entry<String, List<String>> entry : headers.entrySet()) {
for (final String value : entry.getValue()) {
writer.println("Header: " + entry.getKey() + "=" + value);
}
}
writer.println();
writer.flush();
logger.info(swriter.toString());
}
@Override
public Map<String, List<String>> get(final URI uri, final Map<String, List<String>> requestHeaders) throws IOException {
final Map<String, List<String>> resultHeaders = new java.util.HashMap<>(2);
final java.util.Collection<Cookie> cookies = this.cookieStore.getCookies(uri.getScheme(), uri.getHost(), uri.getPath());
if (cookies != null) {
StringBuffer cookieHeaderValue = null;
for (final Cookie cookie : cookies) {
// We should not decode values. Servers expect to receive what they set the values to.
final String cookieName = cookie.getName();
final String cookieValue = cookie.getValue();
final String assignment = cookieName + "=" + cookieValue;
// if(logger.isLoggable(Level.INFO)) {
// logger.info("get(): found cookie: [" + assignment + "]; uri=" + uri);
// }
if (cookieHeaderValue == null) {
cookieHeaderValue = new StringBuffer();
} else {
cookieHeaderValue.append("; ");
}
cookieHeaderValue.append(assignment);
}
if (cookieHeaderValue != null) {
resultHeaders.put("Cookie", java.util.Collections.singletonList(cookieHeaderValue.toString()));
}
}
if (logger.isLoggable(Level.FINE)) {
logger.info("get(): ---- Cookie headers for uri=[" + uri + "].");
printHeaders(resultHeaders);
}
return resultHeaders;
}
@Override
public void put(final URI uri, final Map<String, List<String>> responseHeaders) throws IOException {
if (logger.isLoggable(Level.FINE)) {
logger.info("put(): ---- Response headers for uri=[" + uri + "].");
printHeaders(responseHeaders);
}
storeCookies(uri, responseHeaders);
}
public void storeCookies(final URI uri, final Map<String, List<String>> responseHeaders) {
for (final Map.Entry<String, List<String>> entry : responseHeaders.entrySet()) {
final String key = entry.getKey();
if (key != null) {
for (final String value : entry.getValue()) {
if (value != null) {
if ("Set-Cookie".equalsIgnoreCase(key)) {
cookieStore.saveCookie(uri, value);
// } else if ("Set-Cookie2".equalsIgnoreCase(key)) {
// cookieStore.saveCookie(uri, value);
}
}
}
}
}
}
}