private void processDimeRequest(HttpServletRequest request, HttpServletResponse response) {
S3PutObjectRequest putRequest = null;
S3PutObjectResponse putResponse = null;
int bytesRead = 0;
S3Engine engine = new S3Engine();
try {
logRequest(request);
MultiPartDimeInputStream ds = new MultiPartDimeInputStream( request.getInputStream());
// -> the first stream MUST be the SOAP party
if (ds.nextInputStream())
{
//logger.debug( "DIME msg [" + ds.getStreamType() + "," + ds.getStreamTypeFormat() + "," + ds.getStreamId() + "]" );
byte[] buffer = new byte[8192];
bytesRead = ds.read( buffer, 0, 8192 );
//logger.debug( "DIME SOAP Bytes read: " + bytesRead );
ByteArrayInputStream bis = new ByteArrayInputStream( buffer, 0, bytesRead );
putRequest = toEnginePutObjectRequest( bis );
}
// -> we only need to support a DIME message with two bodyparts
if (null != putRequest && ds.nextInputStream())
{
InputStream is = ds.getInputStream();
putRequest.setData( is );
}
// -> need to do SOAP level auth here, on failure return the SOAP fault
StringBuffer xml = new StringBuffer();
String AWSAccessKey = putRequest.getAccessKey();
UserInfo info = ServiceProvider.getInstance().getUserInfo(AWSAccessKey);
try
{ S3SoapAuth.verifySignature( putRequest.getSignature(), "PutObject", putRequest.getRawTimestamp(), AWSAccessKey, info.getSecretKey());
} catch( AxisFault e ) {
String reason = e.toString();
int start = reason.indexOf( ".AxisFault:" );
if (-1 != start) reason = reason.substring( start+11 );
xml.append( "<?xml version=\"1.0\" encoding=\"utf-8\"?>" );
xml.append( "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" >\n" );
xml.append( "<soap:Body>\n" );
xml.append( "<soap:Fault>\n" );
xml.append( "<faultcode>" ).append( e.getFaultCode().toString()).append( "</faultcode>\n" );
xml.append( "<faultstring>" ).append( reason ).append( "</faultstring>\n" );
xml.append( "</soap:Fault>\n" );
xml.append( "</soap:Body></soap:Envelope>" );
endResponse(response, xml.toString());
return;
}
// -> PutObject S3 Bucket Policy would be done in the engine.handleRequest() call
UserContext.current().initContext( AWSAccessKey, info.getSecretKey(), AWSAccessKey, "S3 DIME request", request );
putResponse = engine.handleRequest( putRequest );
xml.append( "<?xml version=\"1.0\" encoding=\"utf-8\"?>" );
xml.append( "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:tns=\"http://s3.amazonaws.com/doc/2006-03-01/\">" );
xml.append( "<soap:Body>" );
xml.append( "<tns:PutObjectResponse>" );