/*==========================================================================*\
| $Id: UploadPackRequestHandler.java,v 1.2 2012/03/28 13:48:08 stedwar2 Exp $
|*-------------------------------------------------------------------------*|
| Copyright (C) 2011-2012 Virginia Tech
|
| This file is part of Web-CAT.
|
| Web-CAT is free software; you can redistribute it and/or modify
| it under the terms of the GNU Affero General Public License as published
| by the Free Software Foundation; either version 3 of the License, or
| (at your option) any later version.
|
| Web-CAT is distributed in the hope that it will be useful,
| but WITHOUT ANY WARRANTY; without even the implied warranty of
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
| GNU General Public License for more details.
|
| You should have received a copy of the GNU Affero General Public License
| along with Web-CAT; if not, see <http://www.gnu.org/licenses/>.
\*==========================================================================*/
package org.webcat.core.git.http;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpStatus;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.transport.UploadPack;
import org.eclipse.jgit.transport.RefAdvertiser.PacketLineOutRefAdvertiser;
import org.eclipse.jgit.util.HttpSupport;
import org.webcat.core.http.RequestHandlerWithResponse;
import org.webcat.core.http.RequestUtils;
import org.webcat.core.http.SmartGZIPOutputStream;
import com.webobjects.appserver.WORequest;
import com.webobjects.appserver.WOResponse;
//-------------------------------------------------------------------------
/**
* Handles Git Smart HTTP requests for the {@code git-upload-pack} service.
*
* @author Tony Allevato
* @author Last changed by $Author: stedwar2 $
* @version $Revision: 1.2 $, $Date: 2012/03/28 13:48:08 $
*/
public class UploadPackRequestHandler
implements RequestHandlerWithResponse
{
//~ Methods ...............................................................
// ----------------------------------------------------------
/**
* Handles the request and generates the UploadPack response.
*
* @param request the request
* @param response the response
* @throws Exception if an error occurs
*/
public void handleRequest(WORequest request, WOResponse response)
throws Exception
{
String contentType = request.headerForKey(HttpSupport.HDR_CONTENT_TYPE);
if (UPLOAD_PACK_REQUEST_TYPE.equals(contentType))
{
Repository repo =
RepositoryRequestUtils.repositoryFromRequest(request);
UploadPack up = new UploadPack(repo);
up.setBiDirectionalPipe(false);
response.setHeader(UPLOAD_PACK_RESULT_TYPE,
HttpSupport.HDR_CONTENT_TYPE);
InputStream input = RequestUtils.inputStreamForRequest(request);
SmartGZIPOutputStream output =
new SmartGZIPOutputStream(request, response);
up.upload(input, output, null);
output.close();
}
else
{
response.setStatus(HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE);
}
}
//~ Inner classes .........................................................
// ----------------------------------------------------------
/**
* Prepends info/refs advertisements for the {@code git-upload-pack}
* service to a response.
*/
public static class InfoRefs extends SmartHttpInfoRefsFilter
{
//~ Constructors ......................................................
// ----------------------------------------------------------
/**
* Creates a new filter for the {@code git-upload-pack} service.
*/
public InfoRefs()
{
super("git-upload-pack");
}
//~ Methods ...........................................................
// ----------------------------------------------------------
@Override
protected void advertise(WORequest request, Repository repository,
PacketLineOutRefAdvertiser advertiser) throws IOException
{
UploadPack up = new UploadPack(repository);
try
{
up.sendAdvertisedRefs(advertiser);
}
finally
{
up.getRevWalk().release();
}
}
}
//~ Static/instance variables .............................................
private static final String UPLOAD_PACK_REQUEST_TYPE =
"application/x-git-upload-pack-request";
private static final String UPLOAD_PACK_RESULT_TYPE =
"application/x-git-upload-pack-result";
}