Author: janb
Date: Wed Aug 13 17:01:07 2008
New Revision: 685731

URL: http://svn.apache.org/viewvc?rev=685731&view=rev
Log:
Add beginnings of security checking; add StreamObserver.setLength()

Added:
    
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/DestinationRealmResolver.java
   (with props)
Modified:
    
maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-api/src/main/java/org/apache/maven/mercury/crypto/api/StreamObserver.java
    
maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-basic/src/main/java/org/apache/maven/mercury/crypto/pgp/PgpStreamVerifier.java
    
maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-basic/src/main/java/org/apache/maven/mercury/crypto/sha/SHA1Verifier.java
    
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/FileExchange.java
    
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployer.java
    
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeploymentTarget.java
    
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/FilePutExchange.java
    
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/DefaultRetriever.java
    
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/FileGetExchange.java
    
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/RetrievalTarget.java
    
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/test/java/org/apache/maven/mercury/spi/http/client/JettyRetrieverTest.java

Modified: 
maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-api/src/main/java/org/apache/maven/mercury/crypto/api/StreamObserver.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-api/src/main/java/org/apache/maven/mercury/crypto/api/StreamObserver.java?rev=685731&r1=685730&r2=685731&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-api/src/main/java/org/apache/maven/mercury/crypto/api/StreamObserver.java
 (original)
+++ 
maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-api/src/main/java/org/apache/maven/mercury/crypto/api/StreamObserver.java
 Wed Aug 13 17:01:07 2008
@@ -25,5 +25,8 @@
     
     void bytesReady(byte[]b, int off, int len)
     throws StreamObserverException;
+    
+    void setLength(long length);
+    long getLength();
 
 }

Modified: 
maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-basic/src/main/java/org/apache/maven/mercury/crypto/pgp/PgpStreamVerifier.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-basic/src/main/java/org/apache/maven/mercury/crypto/pgp/PgpStreamVerifier.java?rev=685731&r1=685730&r2=685731&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-basic/src/main/java/org/apache/maven/mercury/crypto/pgp/PgpStreamVerifier.java
 (original)
+++ 
maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-basic/src/main/java/org/apache/maven/mercury/crypto/pgp/PgpStreamVerifier.java
 Wed Aug 13 17:01:07 2008
@@ -38,6 +38,9 @@
   private PGPSignature signature;
   
   private String signatureString;
+  
+  private long length = -1;
+  
 
   
//-----------------------------------------------------------------------------------
   public PgpStreamVerifier( StreamVerifierAttributes attributes )
@@ -196,5 +199,14 @@
     return signatureString;
   }
   
//-----------------------------------------------------------------------------------
+  public long getLength()
+  {
+      return length;
+  }
   
//-----------------------------------------------------------------------------------
+  public void setLength(long length)
+  {
+      this.length = length;
+
+  }
 }

Modified: 
maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-basic/src/main/java/org/apache/maven/mercury/crypto/sha/SHA1Verifier.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-basic/src/main/java/org/apache/maven/mercury/crypto/sha/SHA1Verifier.java?rev=685731&r1=685730&r2=685731&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-basic/src/main/java/org/apache/maven/mercury/crypto/sha/SHA1Verifier.java
 (original)
+++ 
maven/sandbox/trunk/mercury/mercury-crypto/mercury-crypto-basic/src/main/java/org/apache/maven/mercury/crypto/sha/SHA1Verifier.java
 Wed Aug 13 17:01:07 2008
@@ -42,6 +42,7 @@
 
     private MessageDigest digest;
     private byte[] digestBytes;
+    private long length  = -1;
     
     private String sig;
     
@@ -105,5 +106,14 @@
         if (digest != null)
             digest.update(b, off, len);
     }
-
+    
//-----------------------------------------------------------------------------------
+    public long getLength()
+    {
+        return length;
+    }
+    
//-----------------------------------------------------------------------------------
+    public void setLength(long length)
+    {
+        this.length = length;
+    }
 }

Added: 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/DestinationRealmResolver.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/DestinationRealmResolver.java?rev=685731&view=auto
==============================================================================
--- 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/DestinationRealmResolver.java
 (added)
+++ 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/DestinationRealmResolver.java
 Wed Aug 13 17:01:07 2008
@@ -0,0 +1,119 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file                  
                                                                          
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.mercury.spi.http.client;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.apache.maven.mercury.transport.api.Server;
+import org.mortbay.jetty.client.HttpDestination;
+import org.mortbay.jetty.client.security.Realm;
+import org.mortbay.jetty.client.security.RealmResolver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * DestinationRealmResolver
+ *
+ * Resolve a security realm based on the Server instance
+ * which matches an async Destination.
+ */
+public class DestinationRealmResolver implements RealmResolver
+{
+    private static final Logger log = 
LoggerFactory.getLogger(DestinationRealmResolver.class);
+    
+    protected Set<Server> _servers = new HashSet<Server>();
+    
+    
+    
+    public DestinationRealmResolver (Set<Server> servers)
+    {
+        _servers.addAll(servers);
+    }
+
+    public Realm getRealm(String name, HttpDestination dest, String pathSpec)
+            throws IOException
+    {
+       InetSocketAddress address = dest.getAddress();
+       boolean secure = dest.isSecure();
+       
+       //get a username and password appropriate for the destination. 
Usernames and passwords are
+       //associated with Server Credential objects.
+       Server server = null;
+       Iterator<Server> itor = _servers.iterator();
+       while (server==null && itor.hasNext())
+       {
+           Server s = itor.next();
+           if (s.getURL() != null)
+           {
+               String protocol = s.getURL().getProtocol();
+               String host = s.getURL().getHost();
+               int port = s.getURL().getPort();
+               
+               //destination.host == server.host &&
+               //destination.port == server.port &&
+               //destination.isSecure && server.protocol == https || 
!destination.isSecure && server.protocol == http
+               if (((dest.isSecure() && "https".equalsIgnoreCase(protocol)) || 
(!dest.isSecure() && "http".equalsIgnoreCase(protocol)))
+                   &&
+                   (address.getPort() == port)
+                   &&
+                   (address.getHostName().equalsIgnoreCase(host)))
+               {
+                   server = s;
+                   if (log.isDebugEnabled())
+                       log.debug("Matched server 
"+address.getHostName()+":"+address.getPort());
+               }
+           }
+       }
+       
+       if (server == null || server.getServerCredentials() == null)
+       {
+           if (log.isDebugEnabled())
+               log.debug("No server matching 
"+address.getHostName()+":"+address.getPort()+" or no credentials");
+           return null;
+       }
+       
+       if (server.getServerCredentials().isCertificate())
+           throw new UnsupportedOperationException("Certificate not 
supported");
+       
+       final Server realmServer = server;
+       return new Realm ()
+       {
+           public String getCredentials()
+           {
+               return realmServer.getServerCredentials().getPass();
+           }
+
+           public String getId()
+           {
+               return realmServer.getId();
+           }
+
+           public String getPrincipal()
+           {
+               return realmServer.getServerCredentials().getUser();
+           }
+
+       };
+    }
+
+}

Propchange: 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/DestinationRealmResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/DestinationRealmResolver.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/DestinationRealmResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/FileExchange.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/FileExchange.java?rev=685731&r1=685730&r2=685731&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/FileExchange.java
 (original)
+++ 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/FileExchange.java
 Wed Aug 13 17:01:07 2008
@@ -20,12 +20,18 @@
 package org.apache.maven.mercury.spi.http.client;
 
 import java.io.File;
+import java.net.InetSocketAddress;
 import java.net.URL;
 
 import org.apache.maven.mercury.transport.api.Binding;
+import org.apache.maven.mercury.transport.api.Credentials;
+import org.apache.maven.mercury.transport.api.Server;
 import org.mortbay.io.Buffer;
 import org.mortbay.jetty.client.HttpClient;
+import org.mortbay.jetty.client.HttpDestination;
 import org.mortbay.jetty.client.HttpExchange;
+import org.mortbay.jetty.client.security.BasicAuthorization;
+import org.mortbay.jetty.client.security.ProxyAuthorization;
 
 /**
  * FileExchange
@@ -45,14 +51,16 @@
     protected String _url;
     protected File _localFile;
     protected Binding _binding;
+    protected Server _server;
 
     public abstract void onFileComplete( String url, File localFile );
 
     public abstract void onFileError( String url, Exception e );
 
 
-    public FileExchange( Binding binding, File localFile, HttpClient client )
+    public FileExchange( Server server, Binding binding, File localFile, 
HttpClient client )
     {
+        _server = server;
         _binding = binding;
         if (_binding != null)
         {
@@ -70,7 +78,40 @@
     {
         try
         {
-            _httpClient.send( this );
+            if (_server != null && _server.hasProxy() && (_server.getProxy() 
!= null))
+            {
+                URL url = new URL(_url);
+                boolean ssl = "https".equalsIgnoreCase(url.getProtocol());
+                URL proxy = _server.getProxy();
+                
+                String host = proxy.getHost();
+                int port = proxy.getPort();
+                boolean proxySsl = 
"https".equalsIgnoreCase(proxy.getProtocol());
+                if (port < 0)
+                {
+                    port = proxySsl?443:80;
+                }
+                InetSocketAddress proxyAddress = new 
InetSocketAddress(host,port);
+                HttpDestination destination = 
_httpClient.getDestination(this.getAddress(), ssl);  
+                destination.setProxy(proxyAddress);
+                
+                //set up authentication for the proxy
+                Credentials proxyCredentials = _server.getProxyCredentials();
+                
+                if (proxyCredentials != null)
+                {
+                    if (proxyCredentials.isCertificate())
+                        throw new UnsupportedOperationException ("Proxy 
credential not supported");
+                    else
+                    destination.setProxyAuthentication(new ProxyAuthorization 
(proxyCredentials.getUser(), proxyCredentials.getPass()));
+                }
+                destination.send(this); 
+            }
+            else
+            { 
+                _httpClient.send( this );
+            }
+            
         }
         catch ( Exception e )
         {

Modified: 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployer.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployer.java?rev=685731&r1=685730&r2=685731&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployer.java
 (original)
+++ 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployer.java
 Wed Aug 13 17:01:07 2008
@@ -34,6 +34,7 @@
 import org.apache.maven.mercury.crypto.api.StreamObserver;
 import org.apache.maven.mercury.crypto.api.StreamVerifierException;
 import org.apache.maven.mercury.crypto.api.StreamVerifierFactory;
+import org.apache.maven.mercury.spi.http.client.DestinationRealmResolver;
 import org.apache.maven.mercury.spi.http.client.FileExchange;
 import org.apache.maven.mercury.spi.http.client.HandshakeExchange;
 import org.apache.maven.mercury.spi.http.client.HttpClientException;
@@ -107,6 +108,7 @@
     {
         _servers.clear();
         _servers.addAll(servers);
+        _httpClient.setRealmResolver(new DestinationRealmResolver(_servers));
     }
     
     public Set<Server> getServers()
@@ -189,7 +191,7 @@
             {
                 Server server = resolveServer(binding);
                 Set<StreamObserver> observers = createStreamObservers(server);
-                target = new DeploymentTarget( _httpClient, batchId, binding, 
request.getValidators(), observers )
+                target = new DeploymentTarget( server, _httpClient, batchId, 
binding, request.getValidators(), observers )
                 {
                     public void onComplete()
                     {

Modified: 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeploymentTarget.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeploymentTarget.java?rev=685731&r1=685730&r2=685731&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeploymentTarget.java
 (original)
+++ 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeploymentTarget.java
 Wed Aug 13 17:01:07 2008
@@ -34,13 +34,12 @@
 import org.apache.maven.mercury.spi.http.client.HttpClientException;
 import org.apache.maven.mercury.spi.http.validate.Validator;
 import org.apache.maven.mercury.transport.api.Binding;
+import org.apache.maven.mercury.transport.api.Server;
 import org.mortbay.jetty.client.HttpClient;
 
 public abstract class DeploymentTarget
 {
-    public static final String __DIGEST_SUFFIX = ".sha1";
-
-
+    protected Server _server;
     protected HttpClient _httpClient;
     protected String _batchId;
     protected Binding _binding;
@@ -125,8 +124,9 @@
         }
     }
 
-    public DeploymentTarget( HttpClient client, String batchId, Binding 
binding, Set<Validator> validators, Set<StreamObserver> observers )
+    public DeploymentTarget( Server server, HttpClient client, String batchId, 
Binding binding, Set<Validator> validators, Set<StreamObserver> observers )
     {
+        _server = server;
         _httpClient = client;
         _batchId = batchId;
         _binding = binding;
@@ -199,7 +199,7 @@
 
     private void deployLocalFile()
     {
-        FilePutExchange fileExchange = new FilePutExchange( _batchId, 
_binding, _binding.getLocalFile(), _observers, _httpClient )
+        FilePutExchange fileExchange = new FilePutExchange( _server, _batchId, 
_binding, _binding.getLocalFile(), _observers, _httpClient )
         {
             public void onFileComplete( String url, File localFile )
             {
@@ -255,7 +255,7 @@
 
         //upload the checksum file
         Set<StreamObserver> emptySet = Collections.emptySet();
-        FilePutExchange checksumExchange = new FilePutExchange( _batchId, 
binding, file, emptySet, _httpClient )
+        FilePutExchange checksumExchange = new FilePutExchange( _server, 
_batchId, binding, file, emptySet, _httpClient )
         {
             public void onFileComplete( String url, File localFile )
             {      

Modified: 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/FilePutExchange.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/FilePutExchange.java?rev=685731&r1=685730&r2=685731&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/FilePutExchange.java
 (original)
+++ 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/FilePutExchange.java
 Wed Aug 13 17:01:07 2008
@@ -39,6 +39,8 @@
 import org.mortbay.io.Buffer;
 import org.mortbay.jetty.HttpMethods;
 import org.mortbay.jetty.client.HttpClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 /**
@@ -49,6 +51,7 @@
  */
 public abstract class FilePutExchange extends FileExchange
 {
+    private static final Logger log = 
LoggerFactory.getLogger(FilePutExchange.class);
     private String _batchId;
     private InputStream _inputStream;
     private String _remoteRepoUrl;
@@ -60,9 +63,9 @@
     public abstract void onFileError( String url, Exception e );
 
 
-    public FilePutExchange( String batchId, Binding binding, File localFile, 
Set<StreamObserver> observers, HttpClient client )
+    public FilePutExchange( Server server, String batchId, Binding binding, 
File localFile, Set<StreamObserver> observers, HttpClient client )
     {
-        super( binding, localFile, client );
+        super( server, binding, localFile, client );
         _observers.addAll(observers);
         _batchId = batchId;
     }
@@ -79,8 +82,14 @@
             setMethod( HttpMethods.PUT );
             setRequestHeader( "Content-Type", "application/octet-stream" );
             if (_binding.isFile())
+            {
                 setRequestHeader( "Content-Length", String.valueOf( 
_localFile.length() ) );
-            
+                if (log.isDebugEnabled())
+                    log.debug("PUT of "+_localFile.length()+" bytes");
+                
+                for (StreamObserver o: _observers)
+                    o.setLength(_localFile.length());
+            }
             setRequestContentSource( getInputStream() );
             setRequestHeader( __BATCH_HEADER, _batchId );            
             super.send();

Modified: 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/DefaultRetriever.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/DefaultRetriever.java?rev=685731&r1=685730&r2=685731&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/DefaultRetriever.java
 (original)
+++ 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/DefaultRetriever.java
 Wed Aug 13 17:01:07 2008
@@ -32,6 +32,7 @@
 import org.apache.maven.mercury.crypto.api.StreamObserver;
 import org.apache.maven.mercury.crypto.api.StreamVerifierException;
 import org.apache.maven.mercury.crypto.api.StreamVerifierFactory;
+import org.apache.maven.mercury.spi.http.client.DestinationRealmResolver;
 import org.apache.maven.mercury.spi.http.client.HttpClientException;
 import org.apache.maven.mercury.transport.api.Binding;
 import org.apache.maven.mercury.transport.api.Server;
@@ -83,6 +84,7 @@
     {
         _servers.clear();
         _servers.addAll(servers);
+        _httpClient.setRealmResolver(new DestinationRealmResolver(_servers));
     }
     
     public Set<Server> getServers()
@@ -171,7 +173,7 @@
                 Server server = resolveServer(binding);
                 Set<StreamObserver> observers = createStreamObservers(server);
                 
-                target = new RetrievalTarget( DefaultRetriever.this, binding, 
request.getValidators(), observers )
+                target = new RetrievalTarget( server, DefaultRetriever.this, 
binding, request.getValidators(), observers )
                 {
                     public void onComplete()
                     {

Modified: 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/FileGetExchange.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/FileGetExchange.java?rev=685731&r1=685730&r2=685731&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/FileGetExchange.java
 (original)
+++ 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/FileGetExchange.java
 Wed Aug 13 17:01:07 2008
@@ -37,8 +37,12 @@
 import org.apache.maven.mercury.transport.api.Binding;
 import org.apache.maven.mercury.transport.api.Server;
 import org.mortbay.io.Buffer;
+import org.mortbay.io.BufferUtil;
+import org.mortbay.jetty.HttpHeaders;
 import org.mortbay.jetty.HttpMethods;
 import org.mortbay.jetty.client.HttpClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 /**
@@ -52,9 +56,11 @@
  */
 public abstract class FileGetExchange extends FileExchange
 {
+    private static final Logger log = 
LoggerFactory.getLogger(FileGetExchange.class);
     private OutputStream _outputStream;
     private Set<StreamObserver> _observers = new HashSet<StreamObserver>();
-
+    int _contentLength = -1;
+    
     /**
      * Constructor.
      *
@@ -63,9 +69,9 @@
      * @param observers      observers of the io stream
      * @param client         async http client
      */
-    public FileGetExchange( Binding binding, File localFile, 
Set<StreamObserver> observers, HttpClient client )
+    public FileGetExchange( Server server, Binding binding, File localFile, 
Set<StreamObserver> observers, HttpClient client )
     {
-        super( binding, localFile, client );
+        super( server, binding, localFile, client );
         _observers.addAll(observers);
     }
 
@@ -77,6 +83,23 @@
         super.send();
     }
 
+    protected void onResponseHeader(Buffer name, Buffer value) throws 
IOException
+    {
+        int header = HttpHeaders.CACHE.getOrdinal(value);
+        switch (header)
+        {
+            case HttpHeaders.CONTENT_LENGTH_ORDINAL:
+                _contentLength = BufferUtil.toInt(value);
+                for (StreamObserver o:_observers)
+                {
+                    o.setLength(_contentLength);
+                }
+                if (log.isDebugEnabled())
+                    log.debug("GET of "+_contentLength +" bytes");
+                break;
+        }
+    }
+    
 
     protected void onResponseComplete()
     {

Modified: 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/RetrievalTarget.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/RetrievalTarget.java?rev=685731&r1=685730&r2=685731&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/RetrievalTarget.java
 (original)
+++ 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/RetrievalTarget.java
 Wed Aug 13 17:01:07 2008
@@ -66,7 +66,7 @@
     protected int _checksumState;
     protected int _targetState;
     
-   
+    protected Server _server;
     protected HttpClientException _exception;
     protected Binding _binding;
     protected File _tempFile;
@@ -89,7 +89,7 @@
      * @param binding
      * @param callback
      */
-    public RetrievalTarget( DefaultRetriever retriever, Binding binding, 
Set<Validator> validators, Set<StreamObserver> observers )
+    public RetrievalTarget( Server server, DefaultRetriever retriever, Binding 
binding, Set<Validator> validators, Set<StreamObserver> observers )
     {
         if ( binding == null || 
                 (binding.getRemoteResource() == null) || 
@@ -98,7 +98,7 @@
         {
             throw new IllegalArgumentException( "Nothing to retrieve" );
         }
-      
+        _server = server;
         _retriever = retriever;
         _binding = binding;
         _validators = validators;
@@ -434,7 +434,7 @@
         updateTargetState( __REQUESTED_STATE, null );
 
         //get the file, calculating the digest for it on the fly
-        FileExchange exchange = new FileGetExchange( _binding, getTempFile(), 
_observers, _retriever.getHttpClient() )
+        FileExchange exchange = new FileGetExchange( _server, _binding, 
getTempFile(), _observers, _retriever.getHttpClient() )
         {
             public void onFileComplete( String url, File localFile )
             {

Modified: 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/test/java/org/apache/maven/mercury/spi/http/client/JettyRetrieverTest.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/test/java/org/apache/maven/mercury/spi/http/client/JettyRetrieverTest.java?rev=685731&r1=685730&r2=685731&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/test/java/org/apache/maven/mercury/spi/http/client/JettyRetrieverTest.java
 (original)
+++ 
maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/test/java/org/apache/maven/mercury/spi/http/client/JettyRetrieverTest.java
 Wed Aug 13 17:01:07 2008
@@ -199,10 +199,10 @@
         
         RetrievalResponse response = retriever.retrieve(request);
         
-        System.err.println("--------- testSyncRetrievalAllGood 
--------------");
-        for (HttpClientException t:response.getExceptions())
-            t.printStackTrace();
-        
System.err.println("-------------------------------------------------");
+//        System.err.println("--------- testSyncRetrievalAllGood 
--------------");
+//        for (HttpClientException t:response.getExceptions())
+//            t.printStackTrace();
+//        
System.err.println("-------------------------------------------------");
         assertEquals(2,response.getExceptions().size());
         assertTrue(!file0.exists());
         assertTrue(!file1.exists());
@@ -238,10 +238,10 @@
         
         RetrievalResponse response = retriever.retrieve(request);
         
-        System.err.println("--------- testSyncRetrievalPgpGood 
--------------");
-        for (HttpClientException t:response.getExceptions())
-            t.printStackTrace();
-        
System.err.println("-------------------------------------------------");
+//        System.err.println("--------- testSyncRetrievalPgpGood 
--------------");
+//        for (HttpClientException t:response.getExceptions())
+//            t.printStackTrace();
+//        
System.err.println("-------------------------------------------------");
         assertEquals( 0, response.getExceptions().size() );
         assertTrue( file6.exists() );
        
@@ -293,10 +293,10 @@
         
         RetrievalResponse response = retriever.retrieve(request);
 
-        System.err.println("--------- testSyncRetrievalFailFast 
-------------");
-        for (HttpClientException t:response.getExceptions())
-           t.printStackTrace();
-        
System.err.println("-------------------------------------------------");
+//        System.err.println("--------- testSyncRetrievalFailFast 
-------------");
+//        for (HttpClientException t:response.getExceptions())
+//           t.printStackTrace();
+//        
System.err.println("-------------------------------------------------");
 
         assertTrue(!file0.exists());
         assertTrue(!file1.exists());
@@ -347,10 +347,10 @@
         request.setFailFast(false);
         RetrievalResponse response = retriever.retrieve(request);
 
-        System.err.println("--------- testSyncRetrievalLenient0 
-------------");
-        for (HttpClientException t:response.getExceptions())
-           t.printStackTrace();
-        
System.err.println("-------------------------------------------------");
+//        System.err.println("--------- testSyncRetrievalLenient0 
-------------");
+//        for (HttpClientException t:response.getExceptions())
+//           t.printStackTrace();
+//        
System.err.println("-------------------------------------------------");
 
         assertEquals(1,response.getExceptions().size());
         
assertEquals(binding2,response.getExceptions().iterator().next().getBinding());
@@ -397,10 +397,10 @@
         request.setFailFast(false);
         RetrievalResponse response = retriever.retrieve(request);
 
-        System.err.println("------------- testSyncRetrievalLenient1 
---------");
-        for (HttpClientException t:response.getExceptions())
-            t.printStackTrace();
-        
System.err.println("-------------------------------------------------");
+//        System.err.println("------------- testSyncRetrievalLenient1 
---------");
+//        for (HttpClientException t:response.getExceptions())
+//            t.printStackTrace();
+//        
System.err.println("-------------------------------------------------");
 
         assertEquals(0,response.getExceptions().size());
         assertTrue(file0.exists());
@@ -452,10 +452,10 @@
         request.setBindings(bindings);
         RetrievalResponse response = retriever.retrieve(request);
 
-        System.err.println("------------ testValidatorSuccess 
---------------");
-        for (HttpClientException t:response.getExceptions())
-            t.printStackTrace();
-        
System.err.println("-------------------------------------------------");
+//        System.err.println("------------ testValidatorSuccess 
---------------");
+//        for (HttpClientException t:response.getExceptions())
+//            t.printStackTrace();
+//        
System.err.println("-------------------------------------------------");
 
         assertEquals(0,response.getExceptions().size());
         assertTrue(file0.exists());
@@ -506,10 +506,10 @@
         request.setBindings(bindings);
         RetrievalResponse response = retriever.retrieve(request);
 
-        System.err.println("---------- testValidatorFail 
--------------------");
-        for (HttpClientException t:response.getExceptions())
-            t.printStackTrace();
-        
System.err.println("-------------------------------------------------");
+//        System.err.println("---------- testValidatorFail 
--------------------");
+//        for (HttpClientException t:response.getExceptions())
+//            t.printStackTrace();
+//        
System.err.println("-------------------------------------------------");
 
         assertEquals(2,response.getExceptions().size());
         assertTrue(!file0.exists());
@@ -544,10 +544,10 @@
         request.setBindings(bindings);
         RetrievalResponse response = retriever.retrieve(request);
 
-        System.err.println("--------- testMemoryRetrieval 
-------------------");
-        for (HttpClientException t:response.getExceptions())
-            t.printStackTrace();
-        
System.err.println("-------------------------------------------------");
+//        System.err.println("--------- testMemoryRetrieval 
-------------------");
+//        for (HttpClientException t:response.getExceptions())
+//            t.printStackTrace();
+//        
System.err.println("-------------------------------------------------");
 
         assertEquals(0,response.getExceptions().size());
         


Reply via email to