package org.limewire.rest; import java.io.File; import java.io.IOException; import java.util.Map; import org.apache.http.HttpEntity; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.nio.entity.NFileEntity; import org.apache.http.protocol.HttpContext; import org.limewire.core.api.URN; import org.limewire.core.api.library.LibraryFileList; import org.limewire.core.api.library.LibraryManager; import org.limewire.core.api.library.LocalFileItem; import org.limewire.core.api.library.URNFactory; import org.limewire.http.handler.MimeTypeProvider; import com.google.inject.Inject; /** * Request handler for streaming services. */ class StreamRequestHandler extends AbstractRestRequestHandler { private final LibraryManager libraryManager; private final MimeTypeProvider mimeTypeProvider; private final URNFactory urnFactory; @Inject public StreamRequestHandler(LibraryManager libraryManager, MimeTypeProvider mimeTypeProvider, URNFactory urnFactory) { this.libraryManager = libraryManager; this.mimeTypeProvider = mimeTypeProvider; this.urnFactory = urnFactory; } @Override public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException { String method = request.getRequestLine().getMethod(); if (RestUtils.GET.equals(method)) { // Get uri target. String uriTarget = RestUtils.getUriTarget(request, RestPrefix.STREAM.pattern()); // Get query parameters. Map<String, String> queryParams = RestUtils.getQueryParams(request); // Set response. process(uriTarget, queryParams, response); } else { response.setStatusCode(HttpStatus.SC_NOT_IMPLEMENTED); } } private URN getSha1UrnStringFromUri(String uri) throws IOException { String sha1 = uri.substring(1); // remove "/..." return urnFactory.createSHA1Urn(sha1); } /** * Processes the specified uri target and query parameters. */ private void process(String uriTarget, Map<String, String> queryParams, HttpResponse response) throws IOException { URN urn; try { urn = this.getSha1UrnStringFromUri(uriTarget); } catch(IOException e) { response.setStatusCode(HttpStatus.SC_NOT_FOUND); return; } // Get library file. LibraryFileList fileList = libraryManager.getLibraryManagedList(); LocalFileItem fi = fileList.getFileItem(urn); if(fi == null || fi.getFile() == null) { response.setStatusCode(HttpStatus.SC_NOT_FOUND); } else { File f = fi.getFile(); String mimeType = mimeTypeProvider.getMimeType(f); HttpEntity entity = new NFileEntity(f, mimeType); response.setEntity(entity); response.setStatusCode(HttpStatus.SC_OK); } } }