Hi,
I’'ve noticed that openfire only uses a favicon in the FaviconServlet when it is located at /favicon.ico
FaviconServlet.java:
byte[] bytes = getImage("http://" + host + "/favicon.ico");
For a private project I’'m using a class analysing the other page and then also taking the faviconheader-entry:
package bilder; import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL; import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.GetMethod; //Author: Torsten Kunkel <torsten@tkunkel.de>
//License: GPL public class FavIconDownloader {
private Integer status; private InputStream responseBody = null; private byte[] body = null; private String contentType; private HttpMethod method = null; public FavIconDownloader() {
} public String toString() {
String rc = "";
rc += "status:" + status;
rc += ", ";
rc += "contentType:" + contentType;
// rc += "\n";
return rc;
} private void downloadSite(String url) throws HttpException {
HttpClient client = new HttpClient(); // establish a connection within 5 seconds
client.getHttpConnectionManager().getParams().setConnectionTimeout(2000); System.out.println("url:" + url); method = new GetMethod(url);
method.setFollowRedirects(true); responseBody = null;
try {
client.executeMethod(method);
responseBody = method.getResponseBodyAsStream();
} catch (IOException ioe) {
throw new HttpException(ioe.getMessage());
} status = method.getStatusCode();
contentType = method.getResponseHeader("Content-Type").getValue(); } public void disconnect() {
method.releaseConnection(); } // XXX this method needs some work
private String analyseBody(String body) {
String rc = null;
try {
if (body != null) {
// System.out.println(body);
int start = body.toUpperCase().indexOf("SHORTCUT ICON");
if (start > 0) {
int end = body.toUpperCase().indexOf(">", start);
if (end > 0) {
String tmp = body.substring(start, end);
// XXX maybe a regex is better
tmp = tmp.replaceAll(" ", ""); // System.out.println(tmp);
start = tmp.indexOf("href=", tmp.indexOf(''"''));
end = tmp.indexOf("\"", start + 6); // +6 because of ''href="''.length
tmp = tmp.substring(start + 4, end);
tmp = tmp.replaceAll("\"", "");
tmp = tmp.replaceAll("''", "");
tmp = tmp.replaceAll("=", "");
rc = tmp;
}
}
} else {
// nothing to do?
}
} catch (Exception e) {
}
return rc; } private String readBaseURL(String complexURL) {
String rc = null;
try {
URL url = new URL(complexURL); rc = url.getProtocol();
rc += "://";
rc += url.getHost(); } catch (MalformedURLException e) {
e.printStackTrace();
}
return rc;
} public byte[] downloadFavIcon(String url) {
byte[] rc = null;
try {
downloadSite(url);
String baseUrl = readBaseURL(url);
if ((status == 200) && (contentType.startsWith("text"))) {
byte[] bytes = new byte[2048];
responseBody.read(bytes);
String favicon = analyseBody(new String(bytes));
System.out.println("favicon: " + favicon); if (favicon == null) {
downloadSite(baseUrl + "/favicon.ico"); } else {
try {
if (!favicon.contains("://")) {
favicon = baseUrl + "/" + favicon;
}
downloadSite(favicon);
} catch (java.lang.IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} if ((contentType.startsWith("image/x-icon")) || (contentType.startsWith("image/icon"))
|| (contentType.startsWith("text/plain"))) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bytes = new byte[2048];
int counter = 0;
while (counter != -1) {
counter = responseBody.read(bytes);
if (counter != -1) {
baos.write(bytes, 0, counter);
}
}
baos.flush();
rc = baos.toByteArray();
if (rc.length == 0) {
rc = null;
}
} else {
if (status != 404) {
System.out.println("!image/x-icon => " + contentType);
System.out.println("status => " + status);
}
}
} catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
disconnect();
return rc;
}
}
and here some testclass:
package test; //Author: Torsten Kunkel <torsten@tkunkel.de>
//License: GPL import bilder.FavIconDownloader; public class Downloadtest {
public Downloadtest() {
FavIconDownloader downloader = new FavIconDownloader();
try {
byte[] image = downloader.downloadFavIcon("http://10.187.112.166/test/neu.html");
if (image == null) {
System.out.println("No image!");
} else {
System.out.println("Image found.");
}
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
Downloadtest downloadtest = new Downloadtest();
}
}
Maybe it’'s usefull for openfire.