Read header using direct stream

This commit is contained in:
René Pfeuffer
2018-08-14 17:31:27 +02:00
parent c8c1cad67f
commit c3a455145a
3 changed files with 36 additions and 5 deletions

View File

@@ -10,6 +10,7 @@ import sonia.scm.repository.RepositoryException;
import sonia.scm.repository.RepositoryNotFoundException; import sonia.scm.repository.RepositoryNotFoundException;
import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryService;
import sonia.scm.repository.api.RepositoryServiceFactory; import sonia.scm.repository.api.RepositoryServiceFactory;
import sonia.scm.util.IOUtil;
import javax.inject.Inject; import javax.inject.Inject;
import javax.ws.rs.GET; import javax.ws.rs.GET;
@@ -20,12 +21,14 @@ import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.StreamingOutput; import javax.ws.rs.core.StreamingOutput;
import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
public class ContentResource { public class ContentResource {
private static final Logger LOG = LoggerFactory.getLogger(ContentResource.class); private static final Logger LOG = LoggerFactory.getLogger(ContentResource.class);
private static final int HEAD_BUFFER_SIZE = 1024;
private final RepositoryServiceFactory serviceFactory; private final RepositoryServiceFactory serviceFactory;
@@ -98,8 +101,17 @@ public class ContentResource {
} }
private byte[] getHead(String revision, String path, RepositoryService repositoryService) throws IOException, RepositoryException { private byte[] getHead(String revision, String path, RepositoryService repositoryService) throws IOException, RepositoryException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); InputStream stream = repositoryService.getCatCommand().setRevision(revision).getStream(path);
repositoryService.getCatCommand().setRevision(revision).retriveContent(outputStream, path); try {
return outputStream.toByteArray(); byte[] buffer = new byte[HEAD_BUFFER_SIZE];
int length = stream.read(buffer);
if (length < buffer.length) {
return Arrays.copyOf(buffer, length);
} else {
return buffer;
}
} finally {
IOUtil.close(stream);
}
} }
} }

View File

@@ -17,6 +17,7 @@ import sonia.scm.repository.api.RepositoryServiceFactory;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput; import javax.ws.rs.core.StreamingOutput;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
@@ -55,7 +56,7 @@ public class ContentResourceTest {
// defaults for unknown things // defaults for unknown things
doThrow(new RepositoryNotFoundException("x")).when(repositoryServiceFactory).create(not(eq(existingNamespaceAndName))); doThrow(new RepositoryNotFoundException("x")).when(repositoryServiceFactory).create(not(eq(existingNamespaceAndName)));
doThrow(new PathNotFoundException("x")).when(catCommand).retriveContent(any(), any()); doThrow(new PathNotFoundException("x")).when(catCommand).getStream(any());
} }
@Test @Test
@@ -104,6 +105,17 @@ public class ContentResourceTest {
assertEquals("text/plain", response.getHeaderString("Content-Type")); assertEquals("text/plain", response.getHeaderString("Content-Type"));
} }
@Test
public void shouldRecognizeShebangSourceCode() throws Exception {
mockContentFromResource("someScript.sh");
Response response = contentResource.get(NAMESPACE, REPO_NAME, REV, "someScript.sh");
assertEquals(200, response.getStatus());
assertEquals("PYTHON", response.getHeaderString("Language"));
assertEquals("application/x-sh", response.getHeaderString("Content-Type"));
}
@Test @Test
public void shouldHandleRandomByteFile() throws Exception { public void shouldHandleRandomByteFile() throws Exception {
mockContentFromResource("JustBytes"); mockContentFromResource("JustBytes");
@@ -127,6 +139,7 @@ public class ContentResourceTest {
outputStream.close(); outputStream.close();
return null; return null;
}).when(catCommand).retriveContent(any(), eq(path)); }).when(catCommand).retriveContent(any(), eq(path));
doAnswer(invocation -> new ByteArrayInputStream(content)).when(catCommand).getStream(eq(path));
} }
private ByteArrayOutputStream readOutputStream(Response response) throws IOException { private ByteArrayOutputStream readOutputStream(Response response) throws IOException {

View File

@@ -0,0 +1,6 @@
#!/usr/bin/python
for f in * ; do
ls $f
done