From 1ee9ccf098eb4ce1c1619ed099ab15cb15cf080c Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Fri, 21 Jun 2019 12:55:25 +0100 Subject: [PATCH] parse X-Have on uploader side --- .../com/muwire/core/upload/ContentRequest.groovy | 1 + .../main/groovy/com/muwire/core/upload/Request.groovy | 9 ++++++++- .../com/muwire/core/upload/UploadManager.groovy | 11 ++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core/src/main/groovy/com/muwire/core/upload/ContentRequest.groovy b/core/src/main/groovy/com/muwire/core/upload/ContentRequest.groovy index 45f03336..fa500f13 100644 --- a/core/src/main/groovy/com/muwire/core/upload/ContentRequest.groovy +++ b/core/src/main/groovy/com/muwire/core/upload/ContentRequest.groovy @@ -2,4 +2,5 @@ package com.muwire.core.upload class ContentRequest extends Request { Range range + boolean have } diff --git a/core/src/main/groovy/com/muwire/core/upload/Request.groovy b/core/src/main/groovy/com/muwire/core/upload/Request.groovy index a38b7d9d..a27acd59 100644 --- a/core/src/main/groovy/com/muwire/core/upload/Request.groovy +++ b/core/src/main/groovy/com/muwire/core/upload/Request.groovy @@ -5,6 +5,7 @@ import java.nio.charset.StandardCharsets import com.muwire.core.Constants import com.muwire.core.InfoHash import com.muwire.core.Persona +import com.muwire.core.util.DataUtil import groovy.util.logging.Log import net.i2p.data.Base64 @@ -48,8 +49,14 @@ class Request { def decoded = Base64.decode(encoded) downloader = new Persona(new ByteArrayInputStream(decoded)) } + + boolean have = false + if (headers.containsKey("X-Have")) { + def encoded = headers["X-Have"].trim() + have = DataUtil.decodeXHave(encoded).size() > 0 + } new ContentRequest( infoHash : infoHash, range : new Range(start, end), - headers : headers, downloader : downloader) + headers : headers, downloader : downloader, have : have) } static Request parseHashListRequest(InfoHash infoHash, InputStream is) throws IOException { diff --git a/core/src/main/groovy/com/muwire/core/upload/UploadManager.groovy b/core/src/main/groovy/com/muwire/core/upload/UploadManager.groovy index 6b7b76ba..3045ce08 100644 --- a/core/src/main/groovy/com/muwire/core/upload/UploadManager.groovy +++ b/core/src/main/groovy/com/muwire/core/upload/UploadManager.groovy @@ -6,6 +6,7 @@ import com.muwire.core.EventBus import com.muwire.core.InfoHash import com.muwire.core.SharedFile import com.muwire.core.connection.Endpoint +import com.muwire.core.download.SourceDiscoveredEvent import com.muwire.core.files.FileManager import groovy.util.logging.Log @@ -61,12 +62,16 @@ public class UploadManager { return } - Request request = Request.parseContentRequest(new InfoHash(infoHashRoot), e.getInputStream()) + ContentRequest request = Request.parseContentRequest(new InfoHash(infoHashRoot), e.getInputStream()) if (request.downloader != null && request.downloader.destination != e.destination) { log.info("Downloader persona doesn't match their destination") e.close() return } + + if (request.have) + eventBus.publish(new SourceDiscoveredEvent(infoHash : request.infoHash, source : e.destination)) + Uploader uploader = new ContentUploader(sharedFiles.iterator().next().file, request, e) eventBus.publish(new UploadEvent(uploader : uploader)) try { @@ -153,6 +158,10 @@ public class UploadManager { e.close() return } + + if (request.have) + eventBus.publish(new SourceDiscoveredEvent(infoHash : request.infoHash, source : e.destination)) + uploader = new ContentUploader(sharedFiles.iterator().next().file, request, e) eventBus.publish(new UploadEvent(uploader : uploader)) try {