diff --git a/httpclient/src/main/java/org/apache/http/conn/ssl/SSLConnectionSocketFactory.java b/httpclient/src/main/java/org/apache/http/conn/ssl/SSLConnectionSocketFactory.java index 3d98ad4be..6dca47516 100644 --- a/httpclient/src/main/java/org/apache/http/conn/ssl/SSLConnectionSocketFactory.java +++ b/httpclient/src/main/java/org/apache/http/conn/ssl/SSLConnectionSocketFactory.java @@ -46,6 +46,7 @@ import javax.security.auth.x500.X500Principal; import org.apache.http.HttpHost; import org.apache.http.annotation.ThreadSafe; import org.apache.http.conn.socket.LayeredConnectionSocketFactory; +import org.apache.http.conn.util.PublicSuffixMatcherLoader; import org.apache.http.protocol.HttpContext; import org.apache.http.util.Args; import org.apache.http.util.TextUtils; @@ -148,7 +149,7 @@ public class SSLConnectionSocketFactory implements LayeredConnectionSocketFactor * @since 4.4 */ public static HostnameVerifier getDefaultHostnameVerifier() { - return new DefaultHostnameVerifier(); + return new DefaultHostnameVerifier(PublicSuffixMatcherLoader.getDefault()); } /** diff --git a/httpclient/src/main/java/org/apache/http/conn/util/PublicSuffixListParser.java b/httpclient/src/main/java/org/apache/http/conn/util/PublicSuffixListParser.java index 1d92b8a54..84bbd182f 100644 --- a/httpclient/src/main/java/org/apache/http/conn/util/PublicSuffixListParser.java +++ b/httpclient/src/main/java/org/apache/http/conn/util/PublicSuffixListParser.java @@ -105,7 +105,7 @@ public final class PublicSuffixListParser { sb.append(c); } if (sb.length() > MAX_LINE_LEN) { - throw new IOException("Line too long"); // prevent excess memory usage + return false; // prevent excess memory usage } } return (b != -1); diff --git a/httpclient/src/main/java/org/apache/http/conn/util/PublicSuffixMatcherLoader.java b/httpclient/src/main/java/org/apache/http/conn/util/PublicSuffixMatcherLoader.java new file mode 100644 index 000000000..44edd57b8 --- /dev/null +++ b/httpclient/src/main/java/org/apache/http/conn/util/PublicSuffixMatcherLoader.java @@ -0,0 +1,86 @@ +/* + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ +package org.apache.http.conn.util; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.Consts; +import org.apache.http.annotation.ThreadSafe; +import org.apache.http.util.Args; + +/** + * @since 4.4 + */ +@ThreadSafe +public final class PublicSuffixMatcherLoader { + + public static PublicSuffixMatcher load(final URL url) throws IOException { + Args.notNull(url, "URL"); + final InputStream in = url.openStream(); + try { + final PublicSuffixList list = new PublicSuffixListParser().parse( + new InputStreamReader(in, Consts.UTF_8)); + return new PublicSuffixMatcher(list.getRules(), list.getExceptions()); + } finally { + in.close(); + } + } + + private static volatile PublicSuffixMatcher DEFAULT_INSTANCE; + + public static PublicSuffixMatcher getDefault() { + if (DEFAULT_INSTANCE == null) { + synchronized (PublicSuffixMatcherLoader.class) { + if (DEFAULT_INSTANCE == null){ + final URL url = PublicSuffixMatcherLoader.class.getResource( + "mozilla/public-suffix-list.txt"); + if (url != null) { + try { + DEFAULT_INSTANCE = load(url); + } catch (IOException ex) { + // Should never happen + final Log log = LogFactory.getLog(PublicSuffixMatcherLoader.class); + if (log.isWarnEnabled()) { + log.warn("Failure loading public suffix list from default resource", ex); + } + } + } else { + DEFAULT_INSTANCE = new PublicSuffixMatcher(Arrays.asList("com"), null); + } + } + } + } + return DEFAULT_INSTANCE; + } + +}