Search in sources :

Example 1 with Status

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);
}
Also used : UserModel(com.gitblit.models.UserModel) Status(com.gitblit.models.FilestoreModel.Status) HttpServletRequest(javax.servlet.http.HttpServletRequest)

Example 2 with Status

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);
        }
    }
}
Also used : UserModel(com.gitblit.models.UserModel) FilestoreModel(com.gitblit.models.FilestoreModel) Status(com.gitblit.models.FilestoreModel.Status)

Example 3 with Status

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();
}
Also used : Status(com.gitblit.models.FilestoreModel.Status) FilestoreModel(com.gitblit.models.FilestoreModel) FileOutputStream(java.io.FileOutputStream) RandomAccessFile(java.io.RandomAccessFile) File(java.io.File) FileInputStream(java.io.FileInputStream) IOException(java.io.IOException) EOFException(java.io.EOFException)

Example 4 with Status

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();
}
Also used : Status(com.gitblit.models.FilestoreModel.Status) FilestoreModel(com.gitblit.models.FilestoreModel) EOFException(java.io.EOFException) FileInputStream(java.io.FileInputStream) IOException(java.io.IOException) EOFException(java.io.EOFException)

Example 5 with Status

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);
    }
}
Also used : UserModel(com.gitblit.models.UserModel) FilestoreModel(com.gitblit.models.FilestoreModel) Status(com.gitblit.models.FilestoreModel.Status)

Aggregations

Status (com.gitblit.models.FilestoreModel.Status)5 FilestoreModel (com.gitblit.models.FilestoreModel)4 UserModel (com.gitblit.models.UserModel)3 EOFException (java.io.EOFException)2 FileInputStream (java.io.FileInputStream)2 IOException (java.io.IOException)2 File (java.io.File)1 FileOutputStream (java.io.FileOutputStream)1 RandomAccessFile (java.io.RandomAccessFile)1 HttpServletRequest (javax.servlet.http.HttpServletRequest)1