skeleton of uploader subsysten
This commit is contained in:
@@ -165,6 +165,11 @@ class ConnectionAcceptor {
|
|||||||
|
|
||||||
|
|
||||||
private void processGET(Endpoint e) {
|
private void processGET(Endpoint e) {
|
||||||
|
byte[] et = new byte[3]
|
||||||
|
final DataInputStream dis = new DataInputStream(e.getInputStream())
|
||||||
|
dis.readFully(et)
|
||||||
|
if (et != "ET ".getBytes(StandardCharsets.US_ASCII))
|
||||||
|
throw new IOException("Invalid GET connection")
|
||||||
// TODO: implement
|
// TODO: implement
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -10,7 +10,7 @@ class FileManager {
|
|||||||
|
|
||||||
|
|
||||||
final EventBus eventBus
|
final EventBus eventBus
|
||||||
final Map<byte[], Set<SharedFile>> rootToFiles = new HashMap<>()
|
final Map<byte[], Set<SharedFile>> rootToFiles = Collections.synchronizedMap(new HashMap<>())
|
||||||
final Map<File, SharedFile> fileToSharedFile = Collections.synchronizedMap(new HashMap<>())
|
final Map<File, SharedFile> fileToSharedFile = Collections.synchronizedMap(new HashMap<>())
|
||||||
final Map<String, Set<File>> nameToFiles = new HashMap<>()
|
final Map<String, Set<File>> nameToFiles = new HashMap<>()
|
||||||
final SearchIndex index = new SearchIndex()
|
final SearchIndex index = new SearchIndex()
|
||||||
@@ -56,6 +56,7 @@ class FileManager {
|
|||||||
void onFileUnsharedEvent(FileUnsharedEvent e) {
|
void onFileUnsharedEvent(FileUnsharedEvent e) {
|
||||||
SharedFile sf = e.unsharedFile
|
SharedFile sf = e.unsharedFile
|
||||||
byte [] root = sf.getInfoHash().getRoot()
|
byte [] root = sf.getInfoHash().getRoot()
|
||||||
|
Set<SharedFile> existing
|
||||||
Set<SharedFile> existing = rootToFiles.get(root)
|
Set<SharedFile> existing = rootToFiles.get(root)
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
existing.remove(sf)
|
existing.remove(sf)
|
||||||
@@ -83,12 +84,17 @@ class FileManager {
|
|||||||
return new HashMap<>(fileToSharedFile)
|
return new HashMap<>(fileToSharedFile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Set<SharedFile> getSharedFiles(byte []root) {
|
||||||
|
return rootToFiles.get(root)
|
||||||
|
}
|
||||||
|
|
||||||
void onSearchEvent(SearchEvent e) {
|
void onSearchEvent(SearchEvent e) {
|
||||||
// hash takes precedence
|
// hash takes precedence
|
||||||
ResultsEvent re = null
|
ResultsEvent re = null
|
||||||
if (e.searchHash != null) {
|
if (e.searchHash != null) {
|
||||||
Set<SharedFile> found = rootToFiles.get e.searchHash
|
Set<SharedFile> found
|
||||||
|
found = rootToFiles.get e.searchHash
|
||||||
if (found != null && !found.isEmpty())
|
if (found != null && !found.isEmpty())
|
||||||
re = new ResultsEvent(results: found.asList(), uuid: e.uuid)
|
re = new ResultsEvent(results: found.asList(), uuid: e.uuid)
|
||||||
} else {
|
} else {
|
||||||
|
10
core/src/main/groovy/com/muwire/core/upload/Range.groovy
Normal file
10
core/src/main/groovy/com/muwire/core/upload/Range.groovy
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package com.muwire.core.upload
|
||||||
|
|
||||||
|
class Range {
|
||||||
|
final long start, end
|
||||||
|
|
||||||
|
Range(long start, long end) {
|
||||||
|
this.start = start
|
||||||
|
this.end = end
|
||||||
|
}
|
||||||
|
}
|
16
core/src/main/groovy/com/muwire/core/upload/Request.groovy
Normal file
16
core/src/main/groovy/com/muwire/core/upload/Request.groovy
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package com.muwire.core.upload
|
||||||
|
|
||||||
|
import com.muwire.core.InfoHash
|
||||||
|
|
||||||
|
import net.i2p.data.Base64
|
||||||
|
|
||||||
|
class Request {
|
||||||
|
InfoHash infoHash
|
||||||
|
Range range
|
||||||
|
Map<String, String> headers
|
||||||
|
|
||||||
|
static Range parse(InfoHash infoHash, InputStream is) throws IOException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,7 @@
|
|||||||
|
package com.muwire.core.upload
|
||||||
|
|
||||||
|
import com.muwire.core.Event
|
||||||
|
|
||||||
|
public class UploadEvent extends Event {
|
||||||
|
Uploader uploader
|
||||||
|
}
|
@@ -0,0 +1,5 @@
|
|||||||
|
package com.muwire.core.upload
|
||||||
|
|
||||||
|
class UploadFinishedEvent {
|
||||||
|
Uploader uploader
|
||||||
|
}
|
@@ -0,0 +1,57 @@
|
|||||||
|
package com.muwire.core.upload
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets
|
||||||
|
|
||||||
|
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.files.FileManager
|
||||||
|
|
||||||
|
import groovy.util.logging.Log
|
||||||
|
import net.i2p.data.Base64
|
||||||
|
|
||||||
|
@Log
|
||||||
|
public class UploadManager {
|
||||||
|
private final EventBus eventBus
|
||||||
|
private final FileManager fileManager
|
||||||
|
|
||||||
|
public UploadManager(EventBus eventBus, FileManager fileManager) {
|
||||||
|
this.eventBus = eventBus
|
||||||
|
this.fileManager = fileManager
|
||||||
|
}
|
||||||
|
|
||||||
|
public void processEndpoint(Endpoint e) throws IOException {
|
||||||
|
while(true) {
|
||||||
|
byte [] infoHashStringBytes = new byte[44]
|
||||||
|
DataInputStream dis = new DataInputStream(e.getInputStream())
|
||||||
|
dis.readFully(infoHashStringBytes)
|
||||||
|
String infoHashString = new String(infoHashStringBytes, StandardCharsets.US_ASCII)
|
||||||
|
log.info("Responding to upload request for root $infoHashString")
|
||||||
|
|
||||||
|
byte [] infoHashRoot = Base64.decode(infoHashStringBytes)
|
||||||
|
Set<SharedFile> sharedFiles = fileManager.getSharedFiles(infoHashRoot)
|
||||||
|
if (sharedFiles == null || sharedFiles.isEmpty()) {
|
||||||
|
log.info "file not found"
|
||||||
|
e.getOutputStream().write("404 File Not Found".getBytes(StandardCharsets.US_ASCII))
|
||||||
|
e.getOutputStream().flush()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
byte [] rn = new byte[2]
|
||||||
|
dis.readFully(rn)
|
||||||
|
if (rn != "\r\n".getBytes(StandardCharsets.US_ASCII)) {
|
||||||
|
log.warning("Malformed GET header")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
Request request = Request.parse(new InfoHash(infoHashRoot), e.getInputStream())
|
||||||
|
Uploader uploader = new Uploader(request, e)
|
||||||
|
eventBus.publish(new UploadEvent(uploader))
|
||||||
|
uploader.respond()
|
||||||
|
eventBus.publish(new UploadFinishedEvent(uploader))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
17
core/src/main/groovy/com/muwire/core/upload/Uploader.groovy
Normal file
17
core/src/main/groovy/com/muwire/core/upload/Uploader.groovy
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package com.muwire.core.upload
|
||||||
|
|
||||||
|
import com.muwire.core.connection.Endpoint
|
||||||
|
|
||||||
|
class Uploader {
|
||||||
|
private final Request request
|
||||||
|
private final Endpoint endpoint
|
||||||
|
|
||||||
|
Uploader(Request request, Endpoint endpoint) {
|
||||||
|
this.request = request
|
||||||
|
this.endpoint = endpoint
|
||||||
|
}
|
||||||
|
|
||||||
|
void respond() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user