(content == null ? EMPTY_CONTENT : content),
response.getHeader("Content-Type"),
response.getHeaders(), mimeTypes);
if (code == 200) { // got a good response
return new ProtocolOutput(c); // return it
} else if (code == 410) { // page is gone
return new ProtocolOutput(c,
ProtocolStatusUtils.makeStatus(ProtocolStatusCodes.GONE, "Http: " + code + " url=" + url));
} else if (code >= 300 && code < 400) { // handle redirect
String location = response.getHeader("Location");
// some broken servers, such as MS IIS, use lowercase header name...
if (location == null) location = response.getHeader("location");
if (location == null) location = "";
u = new URL(u, location);
int protocolStatusCode;
switch (code) {
case 300: // multiple choices, preferred value in Location
protocolStatusCode = ProtocolStatusCodes.MOVED;
break;
case 301: // moved permanently
case 305: // use proxy (Location is URL of proxy)
protocolStatusCode = ProtocolStatusCodes.MOVED;
break;
case 302: // found (temporarily moved)
case 303: // see other (redirect after POST)
case 307: // temporary redirect
protocolStatusCode = ProtocolStatusUtils.TEMP_MOVED;
break;
case 304: // not modified
protocolStatusCode = ProtocolStatusUtils.NOTMODIFIED;
break;
default:
protocolStatusCode = ProtocolStatusUtils.MOVED;
}
// handle this in the higher layer.
return new ProtocolOutput(c, ProtocolStatusUtils.makeStatus(protocolStatusCode, u));
} else if (code == 400) { // bad request, mark as GONE
if (logger.isTraceEnabled()) { logger.trace("400 Bad request: " + u); }
return new ProtocolOutput(c, ProtocolStatusUtils.makeStatus(ProtocolStatusCodes.GONE, u));
} else if (code == 401) { // requires authorization, but no valid auth provided.
if (logger.isTraceEnabled()) { logger.trace("401 Authentication Required"); }
return new ProtocolOutput(c,
ProtocolStatusUtils.makeStatus(ProtocolStatusCodes.ACCESS_DENIED,
"Authentication required: "+ url));
} else if (code == 404) {
return new ProtocolOutput(c,
ProtocolStatusUtils.makeStatus(ProtocolStatusCodes.NOTFOUND, u));
} else if (code == 410) { // permanently GONE
return new ProtocolOutput(c,
ProtocolStatusUtils.makeStatus(ProtocolStatusCodes.GONE, u));
} else {
return new ProtocolOutput(c,
ProtocolStatusUtils.makeStatus(ProtocolStatusCodes.EXCEPTION, "Http code=" + code + ", url="
+ u));
}
} catch (Throwable e) {
logger.error("Failed with the following error: ", e);
return new ProtocolOutput(null,
ProtocolStatusUtils.makeStatus(ProtocolStatusCodes.EXCEPTION, e.toString()));
}
}