use of com.gitblit.models.FilestoreModel.Status in project gitblit by gitblit.
the class FilestoreServlet method doPost.
/**
* Handles batch upload request (metadata)
*
* @param request
* @param response
* @throws javax.servlet.ServletException
* @throws java.io.IOException
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
UrlInfo info = getInfoFromRequest(request);
if (info == null) {
sendError(response, HttpServletResponse.SC_NOT_FOUND);
return;
}
//Post is for batch operations so no oid should be defined
if (info.oid != null) {
sendError(response, HttpServletResponse.SC_BAD_REQUEST);
return;
}
IGitLFS.Batch batch = deserialize(request, response, IGitLFS.Batch.class);
if (batch == null) {
sendError(response, HttpServletResponse.SC_BAD_REQUEST);
return;
}
UserModel user = getUserOrAnonymous(request);
IGitLFS.BatchResponse batchResponse = new IGitLFS.BatchResponse();
if (batch.operation.equalsIgnoreCase("upload")) {
for (IGitLFS.Request item : batch.objects) {
Status state = gitblit.addObject(item.oid, item.size, user, info.repository);
batchResponse.objects.add(getResponseForUpload(info.baseUrl, item.oid, item.size, user.getName(), info.repository.name, state));
}
} else if (batch.operation.equalsIgnoreCase("download")) {
for (IGitLFS.Request item : batch.objects) {
Status state = gitblit.downloadBlob(item.oid, user, info.repository, null);
batchResponse.objects.add(getResponseForDownload(info.baseUrl, item.oid, item.size, user.getName(), info.repository.name, state));
}
} else {
sendError(response, HttpServletResponse.SC_NOT_IMPLEMENTED);
return;
}
response.setStatus(HttpServletResponse.SC_OK);
serialize(response, batchResponse);
}
use of com.gitblit.models.FilestoreModel.Status in project gitblit by gitblit.
the class FilestoreServlet method doGet.
/**
* Handles a download
* Treated as hypermedia request if accept header contains Git-LFS MIME
* otherwise treated as a download of the blob
* @param request
* @param response
* @throws javax.servlet.ServletException
* @throws java.io.IOException
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
UrlInfo info = getInfoFromRequest(request);
if (info == null || info.oid == null) {
sendError(response, HttpServletResponse.SC_NOT_FOUND);
return;
}
UserModel user = getUserOrAnonymous(request);
FilestoreModel model = gitblit.getObject(info.oid, user, info.repository);
long size = FilestoreManager.UNDEFINED_SIZE;
boolean isMetaRequest = AccessRestrictionFilter.hasContentInRequestHeader(request, "Accept", GIT_LFS_META_MIME);
FilestoreModel.Status status = Status.Unavailable;
if (model != null) {
size = model.getSize();
status = model.getStatus();
}
if (!isMetaRequest) {
status = gitblit.downloadBlob(info.oid, user, info.repository, response.getOutputStream());
logger.info(MessageFormat.format("FILESTORE-AUDIT {0}:{4} {1} {2}@{3}", "GET", info.oid, user.getName(), info.repository.name, status.toString()));
}
if (status == Status.Error_Unexpected_Stream_End) {
return;
}
IGitLFS.Response responseObject = getResponseForDownload(info.baseUrl, info.oid, size, user.getName(), info.repository.name, status);
if (responseObject.error == null) {
response.setStatus(responseObject.successCode);
if (isMetaRequest) {
serialize(response, responseObject);
}
} else {
response.setStatus(responseObject.error.code);
if (isMetaRequest) {
serialize(response, responseObject.error);
}
}
}
use of com.gitblit.models.FilestoreModel.Status in project gitblit by gitblit.
the class FilestoreManager method uploadBlob.
@Override
public FilestoreModel.Status uploadBlob(String oid, long size, UserModel user, RepositoryModel repo, InputStream streamIn) {
//Access control and object logic
Status state = addObject(oid, size, user, repo);
if (state != Status.Upload_Pending) {
return state;
}
FilestoreModel model = fileCache.get(oid);
if (!model.actionUpload(user)) {
return Status.Upload_In_Progress;
} else {
long actualSize = 0;
File file = getStoragePath(oid);
try {
file.getParentFile().mkdirs();
file.createNewFile();
try (FileOutputStream streamOut = new FileOutputStream(file)) {
actualSize = IOUtils.copyLarge(streamIn, streamOut);
streamOut.flush();
streamOut.close();
if (model.getSize() != actualSize) {
model.setStatus(Status.Error_Size_Mismatch, user);
logger.warn(MessageFormat.format("Failed to upload blob {0} due to size mismatch, expected {1} got {2}", oid, model.getSize(), actualSize));
} else {
String actualOid = "";
try (FileInputStream fileForHash = new FileInputStream(file)) {
actualOid = DigestUtils.sha256Hex(fileForHash);
fileForHash.close();
}
if (oid.equalsIgnoreCase(actualOid)) {
model.setStatus(Status.Available, user);
} else {
model.setStatus(Status.Error_Hash_Mismatch, user);
logger.warn(MessageFormat.format("Failed to upload blob {0} due to hash mismatch, got {1}", oid, actualOid));
}
}
}
} catch (Exception e) {
model.setStatus(Status.Error_Unknown, user);
logger.warn(MessageFormat.format("Failed to upload blob {0}", oid), e);
} finally {
saveFilestoreModel(model);
}
if (model.isInErrorState()) {
file.delete();
model.removeRepository(repo.name);
}
}
return model.getStatus();
}
use of com.gitblit.models.FilestoreModel.Status in project gitblit by gitblit.
the class FilestoreManager method downloadBlob.
@Override
public FilestoreModel.Status downloadBlob(String oid, UserModel user, RepositoryModel repo, OutputStream streamOut) {
//Access control and object logic
Status status = canGetObject(oid, user, repo);
if (status != Status.Available) {
return status;
}
FilestoreModel item = fileCache.get(oid);
if (streamOut != null) {
try (FileInputStream streamIn = new FileInputStream(getStoragePath(oid))) {
IOUtils.copyLarge(streamIn, streamOut);
streamOut.flush();
streamIn.close();
} catch (EOFException e) {
logger.error(MessageFormat.format("Client aborted connection for {0}", oid), e);
return Status.Error_Unexpected_Stream_End;
} catch (Exception e) {
logger.error(MessageFormat.format("Failed to download blob {0}", oid), e);
return Status.Error_Unknown;
}
}
return item.getStatus();
}
use of com.gitblit.models.FilestoreModel.Status in project gitblit by gitblit.
the class FilestoreServlet method doPut.
/**
* Handles the actual upload (BLOB)
*
* @param request
* @param response
* @throws javax.servlet.ServletException
* @throws java.io.IOException
*/
@Override
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
UrlInfo info = getInfoFromRequest(request);
if (info == null) {
sendError(response, HttpServletResponse.SC_NOT_FOUND);
return;
}
//Put is a singular operation so must have oid
if (info.oid == null) {
sendError(response, HttpServletResponse.SC_BAD_REQUEST);
return;
}
UserModel user = getUserOrAnonymous(request);
long size = FilestoreManager.UNDEFINED_SIZE;
FilestoreModel.Status status = gitblit.uploadBlob(info.oid, size, user, info.repository, request.getInputStream());
IGitLFS.Response responseObject = getResponseForUpload(info.baseUrl, info.oid, size, user.getName(), info.repository.name, status);
logger.info(MessageFormat.format("FILESTORE-AUDIT {0}:{4} {1} {2}@{3}", "PUT", info.oid, user.getName(), info.repository.name, status.toString()));
if (responseObject.error == null) {
response.setStatus(responseObject.successCode);
} else {
serialize(response, responseObject.error);
}
}
Aggregations