private void addRequest(FreenetURI uri) { if (isRunning) { FetchContext mFetchContext = mFetcher.getFetchContext(); mFetchContext.allowSplitfiles = true; // FIXME: disable as soon as its fixed! mFetchContext.canWriteClientCache = true; mFetchContext.dontEnterImplicitArchives = true; // ? mFetchContext.filterData = false; // ? mFetchContext.followRedirects = false; mFetchContext.ignoreStore = false; // final? mFetchContext.ignoreTooManyPathComponents = false; mFetchContext.ignoreUSKDatehints = true; // ? mFetchContext.localRequestOnly = false; mFetchContext.maxArchiveLevels = 0; // ? mFetchContext.maxArchiveRestarts = 0; // ? mFetchContext.maxCheckBlocksPerSegment = 0; // ? mFetchContext.maxDataBlocksPerSegment = 0; // ? // mFetchContext.maxMetadataSize = ? // cooldown for 30 minutes, wtf? this is a real time chat plugin. // mFetchContext.maxNonSplitfileRetries = -1; mFetchContext.maxNonSplitfileRetries = 2; // mFetchContext.maxOutputLength = 1024 ? mFetchContext.maxRecursionLevel = 0; // ? mFetchContext.maxSplitfileBlockRetries = 0; // mFetchContext.maxTempLength = ? // final? mFetchContext.maxUSKRetries = -1; //? // mFetchContext.overrideMIME = "text/plain"; //? // mFetchContext.prefetchHook = ? // mFetchContext.returnZIPManifests = true ? // mFetchContext.tagReplacer = ? // mFetchContext.setCooldownRetries(cooldownRetries); // mFetchContext.setCooldownTime(cooldownTime); try { mFetcher.fetch(uri, this, this, mFetchContext, (short) 1); } catch (FetchException e) { System.err.println( "[Async_AnnounceFetcher]::addRequest() FetchException: " + e.getMessage()); } } }
private void makeMainPage( ToadletContext ctx, List<String> errors, String key, int hexWidth, boolean automf, boolean deep, boolean ml) throws ToadletContextClosedException, IOException, RedirectException, URISyntaxException { PageNode page = pluginContext.pageMaker.getPageNode(i18n("KeyExplorer.PageTitle"), ctx); HTMLNode pageNode = page.outer; HTMLNode contentNode = page.content; byte[] data = null; GetResult getresult = null; String extraParams = "&hexwidth=" + hexWidth; if (automf) { extraParams += "&automf=checked"; } if (deep) { extraParams += "&deep=checked"; } if (ml) { extraParams += "&ml=checked"; } FreenetURI furi = null; FreenetURI retryUri = null; try { if (key != null && (key.trim().length() > 0)) { furi = URISanitizer.sanitizeURI( errors, key, false, URISanitizer.Options.NOMETASTRINGS, URISanitizer.Options.SSKFORUSK); retryUri = furi; if (ml) { // multilevel is requestet Metadata tempMD = KeyExplorerUtils.simpleManifestGet(pluginContext.pluginRespirator, furi); FetchResult tempResult = KeyExplorerUtils.splitGet(pluginContext.pluginRespirator, tempMD); getresult = new GetResult(tempResult.asBucket(), true); data = tempResult.asByteArray(); } else { // normal get getresult = KeyExplorerUtils.simpleGet(pluginContext.pluginRespirator, furi); data = BucketTools.toByteArray(getresult.getData()); } } } catch (MalformedURLException e) { errors.add("MalformedURL: " + key); } catch (IOException e) { Logger.error(this, "500", e); errors.add("IO Error: " + e.getMessage()); } catch (MetadataParseException e) { errors.add("Metadata Parse Error: " + e.getMessage()); } catch (FetchException e) { errors.add("Get failed (" + e.mode + "): " + e.getMessage()); } catch (KeyListenerConstructionException e) { Logger.error(this, "Hu?", e); errors.add("Internal Error: " + e.getMessage()); } finally { if (getresult != null) getresult.free(); } HTMLNode uriBox = createUriBox( pluginContext, ((furi == null) ? null : furi.toString(false, false)), hexWidth, automf, deep, errors); if (errors.size() > 0) { contentNode.addChild(createErrorBox(errors, path(), retryUri, extraParams)); errors.clear(); } contentNode.addChild(uriBox); if (data != null) { Metadata md = null; if (getresult.isMetaData()) { try { md = Metadata.construct(data); } catch (MetadataParseException e) { errors.add("Metadata parse error: " + e.getMessage()); } if (md != null) { if (automf && md.isArchiveManifest()) { if (md.getArchiveType() == ARCHIVE_TYPE.TAR) { writeTemporaryRedirect( ctx, "", KeyUtilsPlugin.PLUGIN_URI + "/Site/?mftype=TARmanifest&key=" + furi + extraParams); return; } else if (md.getArchiveType() == ARCHIVE_TYPE.ZIP) { writeTemporaryRedirect( ctx, "", KeyUtilsPlugin.PLUGIN_URI + "/Site/?mftype=ZIPmanifest&key=" + furi + extraParams); return; } else { errors.add("Unknown Archive Type: " + md.getArchiveType().name()); } } if (automf && md.isSimpleManifest()) { writeTemporaryRedirect( ctx, "", KeyUtilsPlugin.PLUGIN_URI + "/Site/?mftype=simplemanifest&key=" + furi + extraParams); return; } } } String title = "Key: " + furi.toString(false, false); if (getresult.isMetaData()) title = title + "\u00a0(MetaData)"; HTMLNode dataBox2 = pluginContext.pageMaker.getInfobox("#", title, contentNode); dataBox2.addChild("%", "<pre lang=\"en\" style=\"font-family: monospace;\">\n"); dataBox2.addChild("#", hexDump(data, hexWidth)); dataBox2.addChild("%", "\n</pre>"); if (getresult.isMetaData()) { if (md != null) { HTMLNode metaBox = pluginContext.pageMaker.getInfobox("#", "Decomposed metadata", contentNode); metaBox.addChild("#", "Metadata version " + Short.toString(md.getParsedVersion())); metaBox.addChild("br"); metaBox.addChild("#", "Document type:\u00a0"); if (md.isSimpleRedirect()) { metaBox.addChild("#", "SimpleRedirect"); } else if (md.isSimpleManifest()) { metaBox.addChild("#", "SimpleManifest"); } else if (md.isArchiveInternalRedirect()) { metaBox.addChild("#", "ArchiveInternalRedirect"); } else if (md.isArchiveMetadataRedirect()) { metaBox.addChild("#", "ArchiveMetadataRedirect"); } else if (md.isArchiveManifest()) { metaBox.addChild("#", "ArchiveManifest"); } else if (md.isMultiLevelMetadata()) { metaBox.addChild("#", "MultiLevelMetadata"); } else if (md.isSymbolicShortlink()) { metaBox.addChild("#", "SymbolicShortlink"); } else { metaBox.addChild("#", "<Unknown document type>"); } metaBox.addChild("br"); final String MIMEType = md.getMIMEType(); if (MIMEType != null) { metaBox.addChild("#", "MIME Type: " + MIMEType); metaBox.addChild("br"); } if (md.haveFlags()) { metaBox.addChild("#", "Flags:\u00a0"); boolean isFirst = true; if (md.isSplitfile()) { metaBox.addChild("#", "SplitFile"); isFirst = false; } if (md.isCompressed()) { if (isFirst) isFirst = false; else metaBox.addChild("#", "\u00a0"); metaBox.addChild("#", "Compressed (" + md.getCompressionCodec().name + ")"); } if (md.hasTopData()) { if (isFirst) isFirst = false; else metaBox.addChild("#", "\u00a0"); metaBox.addChild("#", "HasTopData"); } if (isFirst) metaBox.addChild("#", "<No flag set>"); } metaBox.addChild("br"); if (md.isCompressed()) { metaBox.addChild("#", "Decompressed size: " + md.uncompressedDataLength() + " bytes."); } else { metaBox.addChild("#", "Uncompressed"); } metaBox.addChild("br"); if (md.topCompatibilityMode != 0) { metaBox.addChild("#", "Compatibility mode: " + md.getTopCompatibilityMode().toString()); metaBox.addChild("br"); } if (md.hasTopData()) { metaBox.addChild("#", "Top Block Data:"); metaBox.addChild("br"); metaBox.addChild( "#", "\u00a0\u00a0DontCompress: " + Boolean.toString(md.topDontCompress)); metaBox.addChild("br"); metaBox.addChild( "#", "\u00a0\u00a0Compressed size: " + Long.toString(md.topCompressedSize) + " bytes."); metaBox.addChild("br"); metaBox.addChild( "#", "\u00a0\u00a0Decompressed Size: " + Long.toString(md.topSize) + " bytes."); metaBox.addChild("br"); metaBox.addChild( "#", "\u00a0\u00a0Blocks: " + Integer.toString(md.topBlocksRequired) + " required, " + Integer.toString(md.topBlocksTotal) + " total."); metaBox.addChild("br"); } final HashResult[] hashes = md.getHashes(); if (hashes != null && hashes.length > 0) { metaBox.addChild("#", "Hashes:"); metaBox.addChild("br"); for (final HashResult hash : hashes) { metaBox.addChild( "#", "\u00a0\u00a0" + hash.type.name() + ": " + HexUtil.bytesToHex(hash.result)); metaBox.addChild("br"); } } if (md.isSplitfile()) { metaBox.addChild("#", "Splitfile size\u00a0=\u00a0" + md.dataLength() + " bytes."); metaBox.addChild("br"); byte[] splitfileCryptoKey = md.getCustomSplitfileKey(); if (splitfileCryptoKey != null) { metaBox.addChild( "#", "Splitfile CryptoKey\u00a0=\u00a0" + HexUtil.bytesToHex(splitfileCryptoKey)); metaBox.addChild("br"); } } metaBox.addChild("#", "Options:"); metaBox.addChild("br"); if (md.isSimpleManifest()) { metaBox.addChild( new HTMLNode( "a", "href", KeyUtilsPlugin.PLUGIN_URI + "/Site/?mftype=simplemanifest&key=" + furi + extraParams, "reopen as manifest")); metaBox.addChild("br"); } if (md.isArchiveManifest()) { metaBox.addChild( new HTMLNode( "a", "href", KeyUtilsPlugin.PLUGIN_URI + "/Site/?mftype=" + md.getArchiveType().name() + "manifest&key=" + furi + extraParams, "reopen as manifest")); metaBox.addChild("br"); } if (md.isMultiLevelMetadata()) { if (ml) metaBox.addChild( new HTMLNode( "a", "href", KeyUtilsPlugin.PLUGIN_URI + "/?key=" + furi + extraParams, "explore multilevel")); else metaBox.addChild( new HTMLNode( "a", "href", KeyUtilsPlugin.PLUGIN_URI + "/?ml=checked&key=" + furi + extraParams, "explore multilevel")); metaBox.addChild("br"); } FreenetURI uri = md.getSingleTarget(); if (uri != null) { String sfrUri = uri.toString(false, false); metaBox.addChild("#", sfrUri); metaBox.addChild("#", "\u00a0"); metaBox.addChild(new HTMLNode("a", "href", "/?key=" + sfrUri, "open")); metaBox.addChild("#", "\u00a0"); metaBox.addChild( new HTMLNode( "a", "href", KeyUtilsPlugin.PLUGIN_URI + "/?key=" + sfrUri + extraParams, "explore")); } else { metaBox.addChild(new HTMLNode("a", "href", "/?key=" + furi, "reopen normal")); } metaBox.addChild("br"); if ((uri == null) && md.isSplitfile()) { metaBox.addChild( new HTMLNode( "a", "href", KeyUtilsPlugin.PLUGIN_URI + "/Split?key=" + furi.toString(false, false), "reopen as splitfile")); metaBox.addChild("br"); metaBox.addChild( new HTMLNode( "a", "href", KeyUtilsPlugin.PLUGIN_URI + "/Download?action=splitdownload&key=" + furi.toString(false, false), "split-download")); metaBox.addChild("br"); } } } if (errors.size() > 0) contentNode.addChild(createErrorBox(errors)); } contentNode.addChild(Utils.makeDonateFooter(_intl)); writeHTMLReply(ctx, 200, "OK", pageNode.generate()); }
@Override public void onFailure(FetchException e, ClientGetter state, ObjectContainer container) { switch (e.getMode()) { case FetchException.RECENTLY_FAILED: // pretty normal for polling.. just add the request again if (state.getURI().toString().contains(mStorage.getCurrentDateString())) { restartRequest(state.getURI()); } else { startRequestForNewEdition(); } break; case FetchException.DATA_NOT_FOUND: // pretty normal for polling.. just add the request again if (state.getURI().toString().contains(mStorage.getCurrentDateString())) { restartRequest(state.getURI()); } else { startRequestForNewEdition(); } break; case FetchException.ALL_DATA_NOT_FOUND: // should not possible while fetching KSKs without following redirects. ? System.err.println( "[Async_AnnounceFetcher] ALL_DATA_NOT_FOUND. you should not see me. ignoring this announce. " + e.getMessage() + " " + state.getURI().toString()); startRequestForNewEdition(); break; case FetchException.ROUTE_NOT_FOUND: // if hit it we are trying to fetch something but the node does not have a proper // connection. // just add the request again if (state.getURI().toString().contains(mStorage.getCurrentDateString())) { restartRequest(state.getURI()); } else { startRequestForNewEdition(); } break; case FetchException.REJECTED_OVERLOAD: // just add the request again if (state.getURI().toString().contains(mStorage.getCurrentDateString())) { restartRequest(state.getURI()); } else { startRequestForNewEdition(); } break; case FetchException.INVALID_METADATA: // wtf? mStorage.announce_ddos += 1; System.err.println( "[Async_AnnounceFetcher] INVALID_METADATA. you should not see me. ignoring this announce. " + e.getMessage() + " " + state.getURI().toString()); startRequestForNewEdition(); break; case FetchException.TOO_BIG_METADATA: // wtf? mStorage.announce_ddos += 1; System.err.println( "[Async_AnnounceFetcher] TOO_BIG_METADATA. you should not see me. ignoring this announce. " + e.getMessage() + " " + state.getURI().toString()); startRequestForNewEdition(); break; case FetchException.TOO_BIG: // should not be possible while polling KSK's without following redirects mStorage.announce_ddos += 1; System.err.println( "[Async_AnnounceFetcher] TOO_BIG. you should not see me. ignoring this announce. " + e.getMessage() + " " + state.getURI().toString()); startRequestForNewEdition(); break; case FetchException.TOO_MANY_REDIRECTS: mStorage.announce_ddos += 1; System.err.println( "[Async_AnnounceFetcher] TOO_MANY_REDIRECTS. you should not see me. ignoring this announce. " + e.getMessage() + " " + state.getURI().toString()); startRequestForNewEdition(); break; case FetchException.TOO_MUCH_RECURSION: // FIXME: wtf? mStorage.announce_ddos += 1; System.err.println( "[Async_AnnounceFetcher] TOO_MUCH_RECURSION. you should not see me. ignoring this announce. " + e.getMessage() + " " + state.getURI().toString()); startRequestForNewEdition(); break; case FetchException.PERMANENT_REDIRECT: mStorage.announce_ddos += 1; System.err.println( "[Async_AnnounceFetcher] TOO_MUCH_RECURSION. you should not see me. ignoring this announce. " + e.getMessage() + " " + state.getURI().toString()); startRequestForNewEdition(); break; default: // now we have a serious problem. mStorage.announce_ddos += 1; System.err.println( "[Async_AnnounceFetcher]::onFailure() unknown error: " + e.getMessage() + " mode=" + e.getMode() + " ignoring this announce. uri=" + state.getURI().toString()); e.printStackTrace(); startRequestForNewEdition(); break; } }