This is an automated email from the ASF dual-hosted git repository.
lewismc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nutch.git
The following commit(s) were added to refs/heads/master by this push:
new 02dca3b6d NUTCH-2936 Early registration of URL stream handlers
provided by plugins may fail Hadoop jobs running in distributed mode (#726)
02dca3b6d is described below
commit 02dca3b6d097af0f8fa76ce17f0a33267964bf19
Author: Lewis John McGibbney <[email protected]>
AuthorDate: Fri May 20 11:04:22 2022 -0700
NUTCH-2936 Early registration of URL stream handlers provided by plugins
may fail Hadoop jobs running in distributed mode (#726)
* NUTCH-2936 Early registration of URL stream handlers provided by plugins
may fail Hadoop jobs running in distributed mode
---
src/java/org/apache/nutch/parse/ParserChecker.java | 48 +++----
src/java/org/apache/nutch/plugin/Extension.java | 12 +-
.../org/apache/nutch/plugin/ExtensionPoint.java | 18 +--
.../apache/nutch/plugin/PluginManifestParser.java | 3 +-
.../org/apache/nutch/plugin/PluginRepository.java | 57 +++++----
.../nutch/plugin/URLStreamHandlerFactory.java | 13 +-
.../apache/nutch/protocol/http/api/HttpBase.java | 140 +++++++++++----------
src/plugin/protocol-foo/plugin.xml | 2 +-
src/plugin/protocol-okhttp/ivy.xml | 4 +-
src/plugin/protocol-okhttp/plugin.xml | 12 +-
.../org/apache/nutch/protocol/okhttp/OkHttp.java | 48 +++----
.../nutch/protocol/okhttp/OkHttpResponse.java | 26 ++--
12 files changed, 195 insertions(+), 188 deletions(-)
diff --git a/src/java/org/apache/nutch/parse/ParserChecker.java
b/src/java/org/apache/nutch/parse/ParserChecker.java
index 6c82a516b..5da023fdc 100644
--- a/src/java/org/apache/nutch/parse/ParserChecker.java
+++ b/src/java/org/apache/nutch/parse/ParserChecker.java
@@ -114,15 +114,15 @@ public class ParserChecker extends AbstractChecker {
int numConsumed;
for (int i = 0; i < args.length; i++) {
if (args[i].equals("-normalize")) {
- normalizers = new URLNormalizers(getConf(),
URLNormalizers.SCOPE_DEFAULT);
+ this.normalizers = new URLNormalizers(getConf(),
URLNormalizers.SCOPE_DEFAULT);
} else if (args[i].equals("-followRedirects")) {
- followRedirects = true;
+ this.followRedirects = true;
} else if (args[i].equals("-checkRobotsTxt")) {
- checkRobotsTxt = true;
+ this.checkRobotsTxt = true;
} else if (args[i].equals("-forceAs")) {
- forceAsContentType = args[++i];
+ this.forceAsContentType = args[++i];
} else if (args[i].equals("-dumpText")) {
- dumpText = true;
+ this.dumpText = true;
} else if (args[i].equals("-md")) {
String k = null, v = null;
String nextOne = args[++i];
@@ -132,7 +132,7 @@ public class ParserChecker extends AbstractChecker {
v = nextOne.substring(firstEquals + 1);
} else
k = nextOne;
- metadata.put(k, v);
+ this.metadata.put(k, v);
} else if ((numConsumed = super.parseArgs(args, i)) > 0) {
i += numConsumed - 1;
} else if (i != args.length - 1) {
@@ -144,7 +144,7 @@ public class ParserChecker extends AbstractChecker {
}
}
- scfilters = new ScoringFilters(getConf());
+ this.scfilters = new ScoringFilters(getConf());
if (url != null) {
return super.processSingle(url);
@@ -155,25 +155,25 @@ public class ParserChecker extends AbstractChecker {
}
protected int process(String url, StringBuilder output) throws Exception {
- if (normalizers != null) {
- url = normalizers.normalize(url, URLNormalizers.SCOPE_DEFAULT);
+ if (this.normalizers != null) {
+ url = this.normalizers.normalize(url, URLNormalizers.SCOPE_DEFAULT);
}
LOG.info("fetching: " + url);
CrawlDatum datum = new CrawlDatum();
- Iterator<String> iter = metadata.keySet().iterator();
+ Iterator<String> iter = this.metadata.keySet().iterator();
while (iter.hasNext()) {
String key = iter.next();
- String value = metadata.get(key);
+ String value = this.metadata.get(key);
if (value == null)
value = "";
datum.getMetaData().put(new Text(key), new Text(value));
}
int maxRedirects = getConf().getInt("http.redirect.max", 3);
- if (followRedirects) {
+ if (this.followRedirects) {
if (maxRedirects == 0) {
LOG.info("Following max. 3 redirects (ignored http.redirect.max ==
0)");
maxRedirects = 3;
@@ -183,30 +183,30 @@ public class ParserChecker extends AbstractChecker {
}
ProtocolOutput protocolOutput = getProtocolOutput(url, datum,
- checkRobotsTxt);
+ this.checkRobotsTxt);
Text turl = new Text(url);
// Following redirects and not reached maxRedirects?
int numRedirects = 0;
while (protocolOutput != null && !protocolOutput.getStatus().isSuccess()
- && followRedirects && protocolOutput.getStatus().isRedirect()
+ && this.followRedirects && protocolOutput.getStatus().isRedirect()
&& maxRedirects >= numRedirects) {
String[] stuff = protocolOutput.getStatus().getArgs();
url = stuff[0];
LOG.info("Follow redirect to {}", url);
- if (normalizers != null) {
- url = normalizers.normalize(url, URLNormalizers.SCOPE_DEFAULT);
+ if (this.normalizers != null) {
+ url = this.normalizers.normalize(url, URLNormalizers.SCOPE_DEFAULT);
}
turl.set(url);
// try again
- protocolOutput = getProtocolOutput(url, datum, checkRobotsTxt);
+ protocolOutput = getProtocolOutput(url, datum, this.checkRobotsTxt);
numRedirects++;
}
- if (checkRobotsTxt && protocolOutput == null) {
+ if (this.checkRobotsTxt && protocolOutput == null) {
System.err.println("Fetch disallowed by robots.txt");
return -1;
}
@@ -231,9 +231,9 @@ public class ParserChecker extends AbstractChecker {
}
String contentType;
- if (forceAsContentType != null) {
- content.setContentType(forceAsContentType);
- contentType = forceAsContentType;
+ if (this.forceAsContentType != null) {
+ content.setContentType(this.forceAsContentType);
+ contentType = this.forceAsContentType;
} else {
contentType = content.getContentType();
}
@@ -253,7 +253,7 @@ public class ParserChecker extends AbstractChecker {
// call the scoring filters
try {
- scfilters.passScoreBeforeParsing(turl, datum, content);
+ this.scfilters.passScoreBeforeParsing(turl, datum, content);
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn("Couldn't pass score before parsing, url " + turl + " (" + e
@@ -284,7 +284,7 @@ public class ParserChecker extends AbstractChecker {
Parse parse = entry.getValue();
// call the scoring filters
try {
- scfilters.passScoreAfterParsing(turl, content, parse);
+ this.scfilters.passScoreAfterParsing(turl, content, parse);
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn("Couldn't pass score after parsing, url " + turl + " (" + e
@@ -295,7 +295,7 @@ public class ParserChecker extends AbstractChecker {
output.append(turl).append("\n");
output.append(parse.getData()).append("\n");
- if (dumpText) {
+ if (this.dumpText) {
output.append(parse.getText());
}
}
diff --git a/src/java/org/apache/nutch/plugin/Extension.java
b/src/java/org/apache/nutch/plugin/Extension.java
index ab65bb82f..246e8ff7b 100644
--- a/src/java/org/apache/nutch/plugin/Extension.java
+++ b/src/java/org/apache/nutch/plugin/Extension.java
@@ -140,13 +140,15 @@ public class Extension {
}
/**
- * Return an instance of the extension implementatio. Before we create a
+ * Return an instance of the extension implementation. Before we create a
* extension instance we startup the plugin if it is not already done. The
* plugin instance and the extension instance use the same
- * <code>PluginClassLoader</code>. Each Plugin use its own classloader. The
- * PluginClassLoader knows only own <i>Plugin runtime libraries </i> setuped
- * in the plugin manifest file and exported libraries of the depenedend
- * plugins.
+ * {@link org.apache.nutch.plugin.PluginClassLoader}.
+ * Each Plugin use its own classloader. The
+ * {@link org.apache.nutch.plugin.PluginClassLoader} knows only its own
+ * <i>plugin runtime libraries</i> defined
+ * in the <code>plugin.xml</code> manifest file and exported libraries
+ * of the dependent plugins.
*
* @return Object An instance of the extension implementation
* @throws PluginRuntimeException if there is a fatal runtime error
diff --git a/src/java/org/apache/nutch/plugin/ExtensionPoint.java
b/src/java/org/apache/nutch/plugin/ExtensionPoint.java
index 58422046b..92ddfd815 100644
--- a/src/java/org/apache/nutch/plugin/ExtensionPoint.java
+++ b/src/java/org/apache/nutch/plugin/ExtensionPoint.java
@@ -44,7 +44,7 @@ public class ExtensionPoint {
setId(pId);
setName(pName);
setSchema(pSchema);
- fExtensions = new ArrayList<>();
+ this.fExtensions = new ArrayList<>();
}
/**
@@ -53,7 +53,7 @@ public class ExtensionPoint {
* @return String
*/
public String getId() {
- return ftId;
+ return this.ftId;
}
/**
@@ -62,7 +62,7 @@ public class ExtensionPoint {
* @return String
*/
public String getName() {
- return fName;
+ return this.fName;
}
/**
@@ -71,7 +71,7 @@ public class ExtensionPoint {
* @return String
*/
public String getSchema() {
- return fSchema;
+ return this.fSchema;
}
/**
@@ -81,7 +81,7 @@ public class ExtensionPoint {
* extension point id
*/
private void setId(String pId) {
- ftId = pId;
+ this.ftId = pId;
}
/**
@@ -90,7 +90,7 @@ public class ExtensionPoint {
* @param pName
*/
private void setName(String pName) {
- fName = pName;
+ this.fName = pName;
}
/**
@@ -99,7 +99,7 @@ public class ExtensionPoint {
* @param pSchema
*/
private void setSchema(String pSchema) {
- fSchema = pSchema;
+ this.fSchema = pSchema;
}
/**
@@ -109,7 +109,7 @@ public class ExtensionPoint {
* to install
*/
public void addExtension(Extension extension) {
- fExtensions.add(extension);
+ this.fExtensions.add(extension);
}
/**
@@ -118,7 +118,7 @@ public class ExtensionPoint {
* @return Extension[]
*/
public Extension[] getExtensions() {
- return fExtensions.toArray(new Extension[fExtensions.size()]);
+ return this.fExtensions.toArray(new Extension[this.fExtensions.size()]);
}
}
diff --git a/src/java/org/apache/nutch/plugin/PluginManifestParser.java
b/src/java/org/apache/nutch/plugin/PluginManifestParser.java
index 4c845b430..ccae5827d 100644
--- a/src/java/org/apache/nutch/plugin/PluginManifestParser.java
+++ b/src/java/org/apache/nutch/plugin/PluginManifestParser.java
@@ -19,6 +19,7 @@ package org.apache.nutch.plugin;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
+import java.lang.invoke.MethodHandles;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
@@ -50,7 +51,7 @@ public class PluginManifestParser {
private static final String ATTR_CLASS = "class";
private static final String ATTR_ID = "id";
- protected static final Logger LOG =
LoggerFactory.getLogger(PluginManifestParser.class);
+ protected static final Logger LOG =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private static final boolean WINDOWS =
System.getProperty("os.name").startsWith("Windows");
diff --git a/src/java/org/apache/nutch/plugin/PluginRepository.java
b/src/java/org/apache/nutch/plugin/PluginRepository.java
index 726da4566..3c554094b 100644
--- a/src/java/org/apache/nutch/plugin/PluginRepository.java
+++ b/src/java/org/apache/nutch/plugin/PluginRepository.java
@@ -64,6 +64,7 @@ public class PluginRepository implements
URLStreamHandlerFactory {
private HashMap<String, Plugin> fActivatedPlugins;
+ @SuppressWarnings("rawtypes")
private static final Map<String, Map<PluginClassLoader, Class>> CLASS_CACHE
= new HashMap<>();
private Configuration conf;
@@ -75,8 +76,8 @@ public class PluginRepository implements
URLStreamHandlerFactory {
* @throws RuntimeException if a fatal runtime error is encountered
*/
public PluginRepository(Configuration conf) throws RuntimeException {
- fActivatedPlugins = new HashMap<>();
- fExtensionPoints = new HashMap<>();
+ this.fActivatedPlugins = new HashMap<>();
+ this.fExtensionPoints = new HashMap<>();
this.conf = new Configuration(conf);
this.auto = conf.getBoolean("plugin.auto-activation", true);
String[] pluginFolders = conf.getStrings("plugin.folders");
@@ -92,11 +93,11 @@ public class PluginRepository implements
URLStreamHandlerFactory {
Pattern includes = Pattern.compile(conf.get("plugin.includes", ""));
Map<String, PluginDescriptor> filteredPlugins = filter(excludes, includes,
allPlugins);
- fRegisteredPlugins = getDependencyCheckedPlugins(filteredPlugins,
+ this.fRegisteredPlugins = getDependencyCheckedPlugins(filteredPlugins,
this.auto ? allPlugins : filteredPlugins);
- installExtensionPoints(fRegisteredPlugins);
+ installExtensionPoints(this.fRegisteredPlugins);
try {
- installExtensions(fRegisteredPlugins);
+ installExtensions(this.fRegisteredPlugins);
} catch (PluginRuntimeException e) {
LOG.error("Could not install extensions.", e.toString());
throw new RuntimeException(e.getMessage());
@@ -134,7 +135,7 @@ public class PluginRepository implements
URLStreamHandlerFactory {
for (ExtensionPoint point : plugin.getExtenstionPoints()) {
String xpId = point.getId();
LOG.debug("Adding extension point {}", xpId);
- fExtensionPoints.put(xpId, point);
+ this.fExtensionPoints.put(xpId, point);
}
}
}
@@ -236,8 +237,8 @@ public class PluginRepository implements
URLStreamHandlerFactory {
* @return PluginDescriptor[]
*/
public PluginDescriptor[] getPluginDescriptors() {
- return fRegisteredPlugins
- .toArray(new PluginDescriptor[fRegisteredPlugins.size()]);
+ return this.fRegisteredPlugins
+ .toArray(new PluginDescriptor[this.fRegisteredPlugins.size()]);
}
/**
@@ -248,7 +249,7 @@ public class PluginRepository implements
URLStreamHandlerFactory {
*/
public PluginDescriptor getPluginDescriptor(String pPluginId) {
- for (PluginDescriptor descriptor : fRegisteredPlugins) {
+ for (PluginDescriptor descriptor : this.fRegisteredPlugins) {
if (descriptor.getPluginId().equals(pPluginId))
return descriptor;
}
@@ -282,8 +283,8 @@ public class PluginRepository implements
URLStreamHandlerFactory {
*/
public Plugin getPluginInstance(PluginDescriptor pDescriptor)
throws PluginRuntimeException {
- if (fActivatedPlugins.containsKey(pDescriptor.getPluginId()))
- return fActivatedPlugins.get(pDescriptor.getPluginId());
+ if (this.fActivatedPlugins.containsKey(pDescriptor.getPluginId()))
+ return this.fActivatedPlugins.get(pDescriptor.getPluginId());
try {
// Must synchronize here to make sure creation and initialization
// of a plugin instance are done by one and only one thread.
@@ -297,7 +298,7 @@ public class PluginRepository implements
URLStreamHandlerFactory {
Plugin plugin = (Plugin) constructor
.newInstance(new Object[] { pDescriptor, this.conf });
plugin.startUp();
- fActivatedPlugins.put(pDescriptor.getPluginId(), plugin);
+ this.fActivatedPlugins.put(pDescriptor.getPluginId(), plugin);
return plugin;
}
} catch (ClassNotFoundException e) {
@@ -318,6 +319,7 @@ public class PluginRepository implements
URLStreamHandlerFactory {
* @deprecated
* @see <a href="https://openjdk.java.net/jeps/421">JEP 421: Deprecate
Finalization for Removal</a>
* @see java.lang.Object#finalize()
+ * @deprecated
*/
@Deprecated
public void finalize() throws Throwable {
@@ -330,12 +332,13 @@ public class PluginRepository implements
URLStreamHandlerFactory {
* @throws PluginRuntimeException
*/
private void shutDownActivatedPlugins() throws PluginRuntimeException {
- for (Plugin plugin : fActivatedPlugins.values()) {
+ for (Plugin plugin : this.fActivatedPlugins.values()) {
plugin.shutDown();
}
}
- public Class getCachedClass(PluginDescriptor pDescriptor, String className)
+ @SuppressWarnings("rawtypes")
+ public static Class getCachedClass(PluginDescriptor pDescriptor, String
className)
throws ClassNotFoundException {
Map<PluginClassLoader, Class> descMap = CLASS_CACHE.get(className);
if (descMap == null) {
@@ -355,19 +358,19 @@ public class PluginRepository implements
URLStreamHandlerFactory {
LOG.info("Plugin Auto-activation mode: [{}]", this.auto);
LOG.info("Registered Plugins:");
- if ((fRegisteredPlugins == null) || (fRegisteredPlugins.size() == 0)) {
+ if ((this.fRegisteredPlugins == null) || (this.fRegisteredPlugins.size()
== 0)) {
LOG.info("\tNONE");
} else {
- for (PluginDescriptor plugin : fRegisteredPlugins) {
+ for (PluginDescriptor plugin : this.fRegisteredPlugins) {
LOG.info("\t{} ({})", plugin.getName(), plugin.getPluginId());
}
}
LOG.info("Registered Extension-Points:");
- if ((fExtensionPoints == null) || (fExtensionPoints.size() == 0)) {
+ if ((this.fExtensionPoints == null) || (this.fExtensionPoints.size() ==
0)) {
LOG.info("\tNONE");
} else {
- for (ExtensionPoint ep : fExtensionPoints.values()) {
+ for (ExtensionPoint ep : this.fExtensionPoints.values()) {
LOG.info("\t ({})", ep.getName(), ep.getId());
}
}
@@ -384,7 +387,7 @@ public class PluginRepository implements
URLStreamHandlerFactory {
* Map of plugins
* @return map of plugins matching the configuration
*/
- private Map<String, PluginDescriptor> filter(Pattern excludes,
+ private static Map<String, PluginDescriptor> filter(Pattern excludes,
Pattern includes, Map<String, PluginDescriptor> plugins) {
Map<String, PluginDescriptor> map = new HashMap<>();
@@ -434,11 +437,11 @@ public class PluginRepository implements
URLStreamHandlerFactory {
public synchronized Object[] getOrderedPlugins(Class<?> clazz,
String xPointId, String orderProperty) {
Object[] filters;
- ObjectCache objectCache = ObjectCache.get(conf);
+ ObjectCache objectCache = ObjectCache.get(this.conf);
filters = (Object[]) objectCache.getObject(clazz.getName());
if (filters == null) {
- String order = conf.get(orderProperty);
+ String order = this.conf.get(orderProperty);
List<String> orderOfFilters = new ArrayList<>();
boolean userDefinedOrder = false;
if (order != null && !order.trim().isEmpty()) {
@@ -447,7 +450,7 @@ public class PluginRepository implements
URLStreamHandlerFactory {
}
try {
- ExtensionPoint point = PluginRepository.get(conf)
+ ExtensionPoint point = PluginRepository.get(this.conf)
.getExtensionPoint(xPointId);
if (point == null)
throw new RuntimeException(xPointId + " not found.");
@@ -579,8 +582,8 @@ public class PluginRepository implements
URLStreamHandlerFactory {
public URLStreamHandler createURLStreamHandler(String protocol) {
LOG.debug("Creating URLStreamHandler for protocol: {}", protocol);
- if (fExtensionPoints != null) {
- ExtensionPoint ep = fExtensionPoints
+ if (this.fExtensionPoints != null) {
+ ExtensionPoint ep = this.fExtensionPoints
.get("org.apache.nutch.protocol.Protocol");
if (ep != null) {
Extension[] extensions = ep.getExtensions();
@@ -602,8 +605,8 @@ public class PluginRepository implements
URLStreamHandlerFactory {
// return the handler here, if possible
String handlerClass = extension.getAttribute("urlStreamHandler");
- LOG.debug("Located URLStreamHandler: {}", handlerClass);
if (handlerClass != null) {
+ LOG.debug("Located URLStreamHandler: {}", handlerClass);
// the nutch classloader
ClassLoader cl = this.getClass().getClassLoader();
if (extinst != null) {
@@ -622,11 +625,11 @@ public class PluginRepository implements
URLStreamHandlerFactory {
}
}
- LOG.debug("suitable protocol extension found that did not declare
a handler");
+ LOG.debug("Suitable protocol extension found that did not declare
a handler");
return null;
}
}
- LOG.debug("No suitable protocol extensions registered");
+ LOG.debug("No suitable protocol extensions registered for protocol:
{}", protocol);
} else {
LOG.debug("No protocol extensions registered?");
}
diff --git a/src/java/org/apache/nutch/plugin/URLStreamHandlerFactory.java
b/src/java/org/apache/nutch/plugin/URLStreamHandlerFactory.java
index a64454c5f..5aed76a35 100644
--- a/src/java/org/apache/nutch/plugin/URLStreamHandlerFactory.java
+++ b/src/java/org/apache/nutch/plugin/URLStreamHandlerFactory.java
@@ -59,7 +59,7 @@ public class URLStreamHandlerFactory
}
private URLStreamHandlerFactory() {
- prs = new ArrayList<>();
+ this.prs = new ArrayList<>();
}
/**
@@ -75,7 +75,7 @@ public class URLStreamHandlerFactory
* @param pr The PluginRepository to be registered.
*/
public void registerPluginRepository(PluginRepository pr) {
- prs.add(new WeakReference<PluginRepository>(pr));
+ this.prs.add(new WeakReference<PluginRepository>(pr));
removeInvalidRefs();
}
@@ -88,7 +88,7 @@ public class URLStreamHandlerFactory
// find the 'correct' PluginRepository. For now we simply take the first.
// then ask it to return the URLStreamHandler
- for(WeakReference<PluginRepository> ref: prs) {
+ for(WeakReference<PluginRepository> ref: this.prs) {
PluginRepository pr = ref.get();
if(pr != null) {
// found PluginRepository. Let's get the URLStreamHandler...
@@ -103,13 +103,12 @@ public class URLStreamHandlerFactory
* garbage collected meanwhile.
*/
private void removeInvalidRefs() {
- LOG.debug("removeInvalidRefs()");
- ArrayList<WeakReference<PluginRepository>> copy = new ArrayList<>(prs);
+ ArrayList<WeakReference<PluginRepository>> copy = new
ArrayList<>(this.prs);
for(WeakReference<PluginRepository> ref: copy) {
if(ref.get() == null) {
- prs.remove(ref);
+ this.prs.remove(ref);
}
}
- LOG.debug("Removed the following invalid references: '{}' Remaining:
'{}'", copy.size()-prs.size(), prs.size());
+ LOG.debug("Removed '{}' invalid references. '{}' remaining.",
copy.size()-this.prs.size(), this.prs.size());
}
}
diff --git
a/src/plugin/lib-http/src/java/org/apache/nutch/protocol/http/api/HttpBase.java
b/src/plugin/lib-http/src/java/org/apache/nutch/protocol/http/api/HttpBase.java
index ce999b374..1438754ce 100644
---
a/src/plugin/lib-http/src/java/org/apache/nutch/protocol/http/api/HttpBase.java
+++
b/src/plugin/lib-http/src/java/org/apache/nutch/protocol/http/api/HttpBase.java
@@ -36,6 +36,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.nutch.crawl.CrawlDatum;
+import org.apache.nutch.metadata.HttpHeaders;
import org.apache.nutch.metadata.Nutch;
import org.apache.nutch.net.protocols.ProtocolLogUtil;
import org.apache.nutch.net.protocols.Response;
@@ -200,7 +201,7 @@ public abstract class HttpBase implements Protocol {
if (logger != null) {
this.logger = logger;
}
- robots = new HttpRobotRulesParser();
+ this.robots = new HttpRobotRulesParser();
}
@Override
@@ -211,7 +212,7 @@ public abstract class HttpBase implements Protocol {
this.proxyType = Proxy.Type.valueOf(conf.get("http.proxy.type", "HTTP"));
this.proxyException = arrayToMap(
conf.getStrings("http.proxy.exception.list"));
- this.useProxy = (proxyHost != null && proxyHost.length() > 0);
+ this.useProxy = (this.proxyHost != null && this.proxyHost.length() > 0);
this.timeout = conf.getInt("http.timeout", 10000);
this.maxContent = conf.getInt("http.content.limit", 1024 * 1024);
this.maxDuration = conf.getInt("http.time.limit", -1);
@@ -219,10 +220,10 @@ public abstract class HttpBase implements Protocol {
this.userAgent = getAgentString(conf.get("http.agent.name"),
conf.get("http.agent.version"), conf.get("http.agent.description"),
conf.get("http.agent.url"), conf.get("http.agent.email"));
- this.acceptLanguage = conf.get("http.accept.language", acceptLanguage)
+ this.acceptLanguage = conf.get("http.accept.language", this.acceptLanguage)
.trim();
- this.acceptCharset = conf.get("http.accept.charset", acceptCharset).trim();
- this.accept = conf.get("http.accept", accept).trim();
+ this.acceptCharset = conf.get("http.accept.charset",
this.acceptCharset).trim();
+ this.accept = conf.get("http.accept", this.accept).trim();
this.mimeTypes = new MimeUtil(conf);
// backward-compatible default setting
this.useHttp11 = conf.getBoolean("http.useHttp11", true);
@@ -244,27 +245,28 @@ public abstract class HttpBase implements Protocol {
// NUTCH-1941: read list of alternating agent names
if (conf.getBoolean("http.agent.rotate", false)) {
String agentsFile = conf.get("http.agent.rotate.file", "agents.txt");
+ @SuppressWarnings("resource")
BufferedReader br = null;
try {
Reader reader = conf.getConfResourceAsReader(agentsFile);
br = new BufferedReader(reader);
- userAgentNames = new ArrayList<String>();
+ this.userAgentNames = new ArrayList<String>();
String word = "";
while ((word = br.readLine()) != null) {
if (!word.trim().isEmpty())
- userAgentNames.add(word.trim());
+ this.userAgentNames.add(word.trim());
}
- if (userAgentNames.size() == 0) {
- logger.warn("Empty list of user agents in http.agent.rotate.file {}",
+ if (this.userAgentNames.size() == 0) {
+ this.logger.warn("Empty list of user agents in
http.agent.rotate.file {}",
agentsFile);
- userAgentNames = null;
+ this.userAgentNames = null;
}
} catch (Exception e) {
- logger.warn("Failed to read http.agent.rotate.file {}: {}", agentsFile,
+ this.logger.warn("Failed to read http.agent.rotate.file {}: {}",
agentsFile,
StringUtils.stringifyException(e));
- userAgentNames = null;
+ this.userAgentNames = null;
} finally {
if (br != null) {
try {
@@ -274,28 +276,29 @@ public abstract class HttpBase implements Protocol {
}
}
}
- if (userAgentNames == null) {
- logger.warn(
+ if (this.userAgentNames == null) {
+ this.logger.warn(
"Falling back to fixed user agent set via property
http.agent.name");
}
}
// If cookies are enabled, try to load a per-host cookie file
- if (enableCookieHeader) {
+ if (this.enableCookieHeader) {
String cookieFile = conf.get("http.agent.host.cookie.file",
"cookies.txt");
+ @SuppressWarnings("resource")
BufferedReader br = null;
try {
Reader reader = conf.getConfResourceAsReader(cookieFile);
br = new BufferedReader(reader);
- hostCookies = new HashMap<String, String>();
+ this.hostCookies = new HashMap<String, String>();
String word = "";
while ((word = br.readLine()) != null) {
if (!word.trim().isEmpty()) {
if (word.indexOf("#") == -1) { // skip comment
String[] parts = word.split("\t");
if (parts.length == 2) {
- hostCookies.put(parts[0], parts[1]);
+ this.hostCookies.put(parts[0], parts[1]);
} else {
LOG.warn("Unable to parse cookie file correctly at: " + word);
}
@@ -303,9 +306,9 @@ public abstract class HttpBase implements Protocol {
}
}
} catch (Exception e) {
- logger.warn("Failed to read http.agent.host.cookie.file {}: {}",
+ this.logger.warn("Failed to read http.agent.host.cookie.file {}: {}",
cookieFile, StringUtils.stringifyException(e));
- hostCookies = null;
+ this.hostCookies = null;
} finally {
if (br != null) {
try {
@@ -368,8 +371,8 @@ public abstract class HttpBase implements Protocol {
"TLS_CHACHA20_POLY1305_SHA256", "TLS_AES_128_GCM_SHA256",
"TLS_AES_128_CCM_8_SHA256", "TLS_AES_128_CCM_SHA256");
- tlsPreferredProtocols = new HashSet<String>(Arrays.asList(protocols));
- tlsPreferredCipherSuites = new HashSet<String>(Arrays.asList(ciphers));
+ this.tlsPreferredProtocols = new HashSet<String>(Arrays.asList(protocols));
+ this.tlsPreferredCipherSuites = new
HashSet<String>(Arrays.asList(ciphers));
logConf();
}
@@ -401,7 +404,7 @@ public abstract class HttpBase implements Protocol {
byte[] content = response.getContent();
Content c = new Content(u.toString(), u.toString(),
(content == null ? EMPTY_CONTENT : content),
- response.getHeader("Content-Type"), response.getHeaders(),
mimeTypes);
+ response.getHeader("Content-Type"), response.getHeaders(),
this.mimeTypes);
if (code == 200) { // got a good response
return new ProtocolOutput(c); // return it
@@ -437,15 +440,15 @@ public abstract class HttpBase implements Protocol {
// handle this in the higher layer.
return new ProtocolOutput(c, new ProtocolStatus(protocolStatusCode,
u));
} else if (code == 400) { // bad request, mark as GONE
- if (logger.isTraceEnabled()) {
- logger.trace("400 Bad request: " + u);
+ if (this.logger.isTraceEnabled()) {
+ this.logger.trace("400 Bad request: " + u);
}
return new ProtocolOutput(c,
new ProtocolStatus(ProtocolStatus.GONE, u));
} else if (code == 401) { // requires authorization, but no valid auth
// provided.
- if (logger.isTraceEnabled()) {
- logger.trace("401 Authentication Required");
+ if (this.logger.isTraceEnabled()) {
+ this.logger.trace("401 Authentication Required");
}
return new ProtocolOutput(c,
new ProtocolStatus(ProtocolStatus.ACCESS_DENIED,
@@ -461,10 +464,10 @@ public abstract class HttpBase implements Protocol {
ProtocolStatus.EXCEPTION, "Http code=" + code + ", url=" + u));
}
} catch (Throwable e) {
- if (logger.isDebugEnabled() || !logUtil.logShort(e)) {
- logger.error("Failed to get protocol output", e);
+ if (this.logger.isDebugEnabled() || !this.logUtil.logShort(e)) {
+ this.logger.error("Failed to get protocol output", e);
} else {
- logger.error("Failed to get protocol output: {}",
+ this.logger.error("Failed to get protocol output: {}",
e.getClass().getName());
}
return new ProtocolOutput(null, new ProtocolStatus(e));
@@ -477,11 +480,11 @@ public abstract class HttpBase implements Protocol {
*/
public String getProxyHost() {
- return proxyHost;
+ return this.proxyHost;
}
public int getProxyPort() {
- return proxyPort;
+ return this.proxyPort;
}
public boolean useProxy(URL url) {
@@ -493,38 +496,38 @@ public abstract class HttpBase implements Protocol {
}
public boolean useProxy(String host) {
- if (useProxy && proxyException.containsKey(host)) {
+ if (this.useProxy && this.proxyException.containsKey(host)) {
return false;
}
- return useProxy;
+ return this.useProxy;
}
public int getTimeout() {
- return timeout;
+ return this.timeout;
}
public boolean isIfModifiedSinceEnabled() {
- return enableIfModifiedsinceHeader;
+ return this.enableIfModifiedsinceHeader;
}
public boolean isCookieEnabled() {
- return enableCookieHeader;
+ return this.enableCookieHeader;
}
public boolean isStoreIPAddress() {
- return storeIPAddress;
+ return this.storeIPAddress;
}
public boolean isStoreHttpRequest() {
- return storeHttpRequest;
+ return this.storeHttpRequest;
}
public boolean isStoreHttpHeaders() {
- return storeHttpHeaders;
+ return this.storeHttpHeaders;
}
public int getMaxContent() {
- return maxContent;
+ return this.maxContent;
}
/**
@@ -533,7 +536,7 @@ public abstract class HttpBase implements Protocol {
* @return the maximum duration
*/
public int getMaxDuration() {
- return maxDuration;
+ return this.maxDuration;
}
/**
@@ -542,15 +545,15 @@ public abstract class HttpBase implements Protocol {
* @return true if partially fetched truncated content is stored
*/
public boolean isStorePartialAsTruncated() {
- return partialAsTruncated;
+ return this.partialAsTruncated;
}
public String getUserAgent() {
- if (userAgentNames != null) {
- return userAgentNames
- .get(ThreadLocalRandom.current().nextInt(userAgentNames.size()));
+ if (this.userAgentNames != null) {
+ return this.userAgentNames
+
.get(ThreadLocalRandom.current().nextInt(this.userAgentNames.size()));
}
- return userAgent;
+ return this.userAgent;
}
/**
@@ -562,8 +565,8 @@ public abstract class HttpBase implements Protocol {
* @return the cookie or null
*/
public String getCookie(URL url) {
- if (hostCookies != null) {
- return hostCookies.get(url.getHost());
+ if (this.hostCookies != null) {
+ return this.hostCookies.get(url.getHost());
}
return null;
@@ -575,38 +578,37 @@ public abstract class HttpBase implements Protocol {
* @return The value of the header "Accept-Language" header.
*/
public String getAcceptLanguage() {
- return acceptLanguage;
+ return this.acceptLanguage;
}
public String getAcceptCharset() {
- return acceptCharset;
+ return this.acceptCharset;
}
public String getAccept() {
- return accept;
+ return this.accept;
}
public boolean getUseHttp11() {
- return useHttp11;
+ return this.useHttp11;
}
public boolean isTlsCheckCertificates() {
- return tlsCheckCertificate;
+ return this.tlsCheckCertificate;
}
public Set<String> getTlsPreferredCipherSuites() {
- return tlsPreferredCipherSuites;
+ return this.tlsPreferredCipherSuites;
}
public Set<String> getTlsPreferredProtocols() {
- return tlsPreferredProtocols;
+ return this.tlsPreferredProtocols;
}
private static String getAgentString(String agentName, String agentVersion,
String agentDesc, String agentURL, String agentEmail) {
if ((agentName == null) || (agentName.trim().length() == 0)) {
- // TODO : NUTCH-258
if (LOG.isErrorEnabled()) {
LOG.error("No User-Agent string set (http.agent.name)!");
}
@@ -645,16 +647,16 @@ public abstract class HttpBase implements Protocol {
}
protected void logConf() {
- if (logger.isInfoEnabled()) {
- logger.info("http.proxy.host = " + proxyHost);
- logger.info("http.proxy.port = " + proxyPort);
- logger.info("http.proxy.exception.list = " + useProxy);
- logger.info("http.timeout = " + timeout);
- logger.info("http.content.limit = " + maxContent);
- logger.info("http.agent = " + userAgent);
- logger.info("http.accept.language = " + acceptLanguage);
- logger.info("http.accept = " + accept);
- logger.info("http.enable.cookie.header = " + isCookieEnabled());
+ if (this.logger.isInfoEnabled()) {
+ this.logger.info("http.proxy.host = " + this.proxyHost);
+ this.logger.info("http.proxy.port = " + this.proxyPort);
+ this.logger.info("http.proxy.exception.list = " + this.useProxy);
+ this.logger.info("http.timeout = " + this.timeout);
+ this.logger.info("http.content.limit = " + this.maxContent);
+ this.logger.info("http.agent = " + this.userAgent);
+ this.logger.info("http.accept.language = " + this.acceptLanguage);
+ this.logger.info("http.accept = " + this.accept);
+ this.logger.info("http.enable.cookie.header = " + isCookieEnabled());
}
}
@@ -748,7 +750,7 @@ public abstract class HttpBase implements Protocol {
if (content != null) {
System.out.println("Content Type: " + content.getContentType());
System.out.println("Content Length: "
- + content.getMetadata().get(Response.CONTENT_LENGTH));
+ + content.getMetadata().get(HttpHeaders.CONTENT_LENGTH));
System.out.println("Content:");
String text = new String(content.getContent());
System.out.println(text);
@@ -761,7 +763,7 @@ public abstract class HttpBase implements Protocol {
@Override
public BaseRobotRules getRobotRules(Text url, CrawlDatum datum,
List<Content> robotsTxtContent) {
- return robots.getRobotRulesSet(this, url, robotsTxtContent);
+ return this.robots.getRobotRulesSet(this, url, robotsTxtContent);
}
/**
@@ -771,7 +773,7 @@ public abstract class HttpBase implements Protocol {
* String[]
* @return a new HashMap
*/
- private HashMap<String, String> arrayToMap(String[] input) {
+ private static HashMap<String, String> arrayToMap(String[] input) {
if (input == null || input.length == 0) {
return new HashMap<String, String>();
}
diff --git a/src/plugin/protocol-foo/plugin.xml
b/src/plugin/protocol-foo/plugin.xml
index 850afe33f..d34f6242a 100755
--- a/src/plugin/protocol-foo/plugin.xml
+++ b/src/plugin/protocol-foo/plugin.xml
@@ -40,7 +40,7 @@
<implementation id="org.apache.nutch.protocol.foo.Foo"
class="org.apache.nutch.protocol.foo.Foo">
<parameter name="protocolName" value="foo"/>
- <parameter name="urlStreamHandler"
value="org.apache.nutch.protocol.foo.Handler"/>
+ <parameter name="urlStreamHandler"
value="org.apache.nutch.protocol.foo.Handler"/>
</implementation>
</extension>
diff --git a/src/plugin/protocol-okhttp/ivy.xml
b/src/plugin/protocol-okhttp/ivy.xml
index 36befcf45..ead823247 100644
--- a/src/plugin/protocol-okhttp/ivy.xml
+++ b/src/plugin/protocol-okhttp/ivy.xml
@@ -36,8 +36,8 @@
</publications>
<dependencies>
- <dependency org="com.squareup.okhttp3" name="okhttp" rev="4.9.1"/>
- <dependency org="com.squareup.okhttp3" name="okhttp-brotli" rev="4.9.1"/>
+ <dependency org="com.squareup.okhttp3" name="okhttp" rev="4.9.3"/>
+ <dependency org="com.squareup.okhttp3" name="okhttp-brotli" rev="4.9.3"/>
</dependencies>
</ivy-module>
diff --git a/src/plugin/protocol-okhttp/plugin.xml
b/src/plugin/protocol-okhttp/plugin.xml
index 5138a155e..e2183d2b5 100755
--- a/src/plugin/protocol-okhttp/plugin.xml
+++ b/src/plugin/protocol-okhttp/plugin.xml
@@ -26,15 +26,15 @@
<export name="*"/>
</library>
<!-- dependencies of OkHttp -->
- <library name="okhttp-4.9.1.jar"/>
- <library name="okhttp-brotli-4.9.1.jar"/>
- <library name="okio-2.8.0.jar"/>
+ <library name="annotations-13.0.jar"/>
+ <library name="dec-0.1.2.jar"/>
<library name="kotlin-stdlib-1.4.10.jar"/>
<library name="kotlin-stdlib-common-1.4.10.jar"/>
<library name="kotlin-stdlib-jdk7-1.4.10.jar"/>
<library name="kotlin-stdlib-jdk8-1.4.10.jar"/>
- <library name="annotations-13.0.jar"/>
- <library name="dec-0.1.2.jar"/>
+ <library name="okhttp-4.9.3.jar"/>
+ <library name="okhttp-brotli-4.9.3.jar"/>
+ <library name="okio-2.8.0.jar"/>
<!-- end of dependencies of OkHttp -->
</runtime>
@@ -54,7 +54,7 @@
<implementation id="org.apache.nutch.protocol.okhttp.OkHttp"
class="org.apache.nutch.protocol.okhttp.OkHttp">
- <parameter name="protocolName" value="https"/>
+ <parameter name="protocolName" value="https"/>
</implementation>
</extension>
diff --git
a/src/plugin/protocol-okhttp/src/java/org/apache/nutch/protocol/okhttp/OkHttp.java
b/src/plugin/protocol-okhttp/src/java/org/apache/nutch/protocol/okhttp/OkHttp.java
index 65cb2d394..d5ab77ec5 100644
---
a/src/plugin/protocol-okhttp/src/java/org/apache/nutch/protocol/okhttp/OkHttp.java
+++
b/src/plugin/protocol-okhttp/src/java/org/apache/nutch/protocol/okhttp/OkHttp.java
@@ -112,7 +112,7 @@ public class OkHttp extends HttpBase {
// protocols in order of preference
List<okhttp3.Protocol> protocols = new ArrayList<>();
- if (useHttp2) {
+ if (this.useHttp2) {
protocols.add(okhttp3.Protocol.HTTP_2);
}
protocols.add(okhttp3.Protocol.HTTP_1_1);
@@ -121,11 +121,11 @@ public class OkHttp extends HttpBase {
.protocols(protocols) //
.retryOnConnectionFailure(true) //
.followRedirects(false) //
- .connectTimeout(timeout, TimeUnit.MILLISECONDS)
- .writeTimeout(timeout, TimeUnit.MILLISECONDS)
- .readTimeout(timeout, TimeUnit.MILLISECONDS);
+ .connectTimeout(this.timeout, TimeUnit.MILLISECONDS)
+ .writeTimeout(this.timeout, TimeUnit.MILLISECONDS)
+ .readTimeout(this.timeout, TimeUnit.MILLISECONDS);
- if (!tlsCheckCertificate) {
+ if (!this.tlsCheckCertificate) {
builder.sslSocketFactory(trustAllSslSocketFactory,
(X509TrustManager) trustAllCerts[0]);
builder.hostnameVerifier(new HostnameVerifier() {
@@ -136,23 +136,23 @@ public class OkHttp extends HttpBase {
});
}
- if (!accept.isEmpty()) {
- getCustomRequestHeaders().add(new String[] { "Accept", accept });
+ if (!this.accept.isEmpty()) {
+ getCustomRequestHeaders().add(new String[] { "Accept", this.accept });
}
- if (!acceptLanguage.isEmpty()) {
+ if (!this.acceptLanguage.isEmpty()) {
getCustomRequestHeaders()
- .add(new String[] { "Accept-Language", acceptLanguage });
+ .add(new String[] { "Accept-Language", this.acceptLanguage });
}
- if (!acceptCharset.isEmpty()) {
+ if (!this.acceptCharset.isEmpty()) {
getCustomRequestHeaders()
- .add(new String[] { "Accept-Charset", acceptCharset });
+ .add(new String[] { "Accept-Charset", this.acceptCharset });
}
- if (useProxy) {
- Proxy proxy = new Proxy(proxyType,
- new InetSocketAddress(proxyHost, proxyPort));
+ if (this.useProxy) {
+ Proxy proxy = new Proxy(this.proxyType,
+ new InetSocketAddress(this.proxyHost, this.proxyPort));
String proxyUsername = conf.get("http.proxy.username");
if (proxyUsername == null) {
ProxySelector selector = new ProxySelector() {
@@ -172,9 +172,9 @@ public class OkHttp extends HttpBase {
@Override
public List<Proxy> select(URI uri) {
if (useProxy(uri)) {
- return proxyList;
+ return this.proxyList;
}
- return noProxyList;
+ return this.noProxyList;
}
@Override
@@ -192,7 +192,7 @@ public class OkHttp extends HttpBase {
* ProxySelector class with proxy auth. If a proxy username is present,
* the configured proxy will be used for ALL requests.
*/
- if (proxyException.size() > 0) {
+ if (this.proxyException.size() > 0) {
LOG.warn(
"protocol-okhttp does not respect 'http.proxy.exception.list'
setting when "
+ "'http.proxy.username' is set. This is a limitation of the
current okhttp3 "
@@ -214,14 +214,14 @@ public class OkHttp extends HttpBase {
}
}
- if (storeIPAddress || storeHttpHeaders || storeHttpRequest) {
+ if (this.storeIPAddress || this.storeHttpHeaders || this.storeHttpRequest)
{
builder.addNetworkInterceptor(new HTTPHeadersInterceptor());
}
// enable support for Brotli compression (Content-Encoding)
builder.addInterceptor(BrotliInterceptor.INSTANCE);
- client = builder.build();
+ this.client = builder.build();
}
class HTTPHeadersInterceptor implements Interceptor {
@@ -241,7 +241,7 @@ public class OkHttp extends HttpBase {
Connection connection = chain.connection();
String ipAddress = null;
- if (storeIPAddress) {
+ if (OkHttp.this.storeIPAddress) {
InetAddress address = connection.socket().getInetAddress();
ipAddress = address.getHostAddress();
}
@@ -252,7 +252,7 @@ public class OkHttp extends HttpBase {
StringBuilder requestverbatim = null;
StringBuilder responseverbatim = null;
- if (storeHttpRequest) {
+ if (OkHttp.this.storeHttpRequest) {
requestverbatim = new StringBuilder();
requestverbatim.append(request.method()).append(' ');
@@ -277,7 +277,7 @@ public class OkHttp extends HttpBase {
requestverbatim.append("\r\n");
}
- if (storeHttpHeaders) {
+ if (OkHttp.this.storeHttpHeaders) {
responseverbatim = new StringBuilder();
responseverbatim.append(getNormalizedProtocolName(response.protocol()))
@@ -322,11 +322,11 @@ public class OkHttp extends HttpBase {
}
protected List<String[]> getCustomRequestHeaders() {
- return customRequestHeaders;
+ return this.customRequestHeaders;
}
protected OkHttpClient getClient() {
- return client;
+ return this.client;
}
@Override
diff --git
a/src/plugin/protocol-okhttp/src/java/org/apache/nutch/protocol/okhttp/OkHttpResponse.java
b/src/plugin/protocol-okhttp/src/java/org/apache/nutch/protocol/okhttp/OkHttpResponse.java
index 54675e3b2..6dcbe16ed 100644
---
a/src/plugin/protocol-okhttp/src/java/org/apache/nutch/protocol/okhttp/OkHttpResponse.java
+++
b/src/plugin/protocol-okhttp/src/java/org/apache/nutch/protocol/okhttp/OkHttpResponse.java
@@ -55,15 +55,15 @@ public class OkHttpResponse implements Response {
}
public void setReason(TruncatedContentReason val) {
- value = val;
+ this.value = val;
}
public TruncatedContentReason getReason() {
- return value;
+ return this.value;
}
public boolean booleanValue() {
- return value != TruncatedContentReason.NOT_TRUNCATED;
+ return this.value != TruncatedContentReason.NOT_TRUNCATED;
}
}
@@ -123,7 +123,7 @@ public class OkHttpResponse implements Response {
response.message());
TruncatedContent truncated = new TruncatedContent();
- content = toByteArray(response.body(), truncated, okhttp.getMaxContent(),
+ this.content = toByteArray(response.body(), truncated,
okhttp.getMaxContent(),
okhttp.getMaxDuration(), okhttp.isStorePartialAsTruncated());
responsemetadata.add(FETCH_TIME,
Long.toString(System.currentTimeMillis()));
@@ -135,11 +135,11 @@ public class OkHttpResponse implements Response {
responsemetadata.set(TRUNCATED_CONTENT_REASON,
truncated.getReason().toString().toLowerCase(Locale.ROOT));
LOG.debug("HTTP content truncated to {} bytes (reason: {})",
- content.length, truncated.getReason());
+ this.content.length, truncated.getReason());
}
- code = response.code();
- headers = responsemetadata;
+ this.code = response.code();
+ this.headers = responsemetadata;
}
}
@@ -179,7 +179,7 @@ public class OkHttpResponse implements Response {
if (partialAsTruncated && source.getBuffer().size() > 0) {
// treat already fetched content as truncated
truncated.setReason(TruncatedContentReason.DISCONNECT);
- LOG.info("Truncated content for {}, partial fetch caused by:", url,
+ LOG.info("Truncated content for {}, partial fetch caused by:",
this.url,
e);
} else {
throw e;
@@ -222,23 +222,23 @@ public class OkHttpResponse implements Response {
}
public URL getUrl() {
- return url;
+ return this.url;
}
public int getCode() {
- return code;
+ return this.code;
}
public String getHeader(String name) {
- return headers.get(name);
+ return this.headers.get(name);
}
public Metadata getHeaders() {
- return headers;
+ return this.headers;
}
public byte[] getContent() {
- return content;
+ return this.content;
}
}