Rodney Beede created JCLOUDS-155:
------------------------------------

             Summary: HTTP headers are incorrectly treated case sensitive 
causing OpenStack x-storage-url to fail
                 Key: JCLOUDS-155
                 URL: https://issues.apache.org/jira/browse/JCLOUDS-155
             Project: jclouds
          Issue Type: Bug
          Components: jclouds-blobstore
    Affects Versions: 1.6.1, 1.5.10, 1.7.0
         Environment: Apache 2.2 with mod_wsgi produces HTTP header 
"x-storage-url"

            Reporter: Rodney Beede
            Priority: Blocker


There is a bug in jclouds (confirmed 1.6 and 1.5, probably also 1.7) where it 
does not correctly detect the OpenStack "X-Storage-Url" HTTP header due to a 
code logic bug regarding case sensitivity.  When parsing the authentication 
response the "X-Storage-Url" header is sent back from the server.  Some web 
servers send back this header as "x-storage-url" instead which causes jclouds 
to not grab the value and thus use the wrong URL for subsequent requests.

The code points are detailed below.  The code should be modified to use case 
insensitive matches for the header values as HTTP headers are case insensitive 
according to RFC 2616.

As Swift grizzly has a guide for using Apache this will become an important 
issue as more people use that web server for their proxy-server.  
http://docs.openstack.org/developer/swift/apache_deployment_guide.html



jclouds-1.6.x\common\openstack\src\main\java\org\jclouds\openstack\reference\AuthHeaders.java

        public static final String URL_SUFFIX = "-Url";
        public static final String STORAGE_URL = "X-Storage" + URL_SUFFIX;


jclouds-1.6.x\apis\swift\src\main\java\org\jclouds\openstack\swift\config\SwiftRestClientModule.java

   public static class StorageEndpointModule extends 
OpenStackAuthenticationModule {
      @Provides
      @Singleton
      @Storage
      protected Supplier<URI> 
provideStorageUrl(URIFromAuthenticationResponseForService.Factory factory) {
         return factory.create(AuthHeaders.STORAGE_URL);
      }
   }
   
  
NOTE:  Creates a URIFromAuthenticationResponseForService object with uses 
AuthHeaders.STORAGE_URL as the reference.




jclouds-1.6.x\common\openstack\src\main\java\org\jclouds\openstack\functions\URIFromAuthenticationResponseForService.java


   public static interface Factory {
      URIFromAuthenticationResponseForService create(String service);
   }

   Leads to
   
   public 
URIFromAuthenticationResponseForService(Supplier<AuthenticationResponse> auth, 
@Assisted String service) {
      this.auth = auth;
      this.service = service;
   }

   
   So we have an AuthenticationResponse (inside Supplier) and "String service" 
or this.service = AuthHeaders.STORAGE_URL = "X-Storage-Url"
   
   



jclouds-1.6.x\common\openstack\src\main\java\org\jclouds\openstack\domain\AuthenticationResponse.java

   public AuthenticationResponse(String authToken, Map<String, URI> services) {
      this.authToken = checkNotNull(authToken, "authToken");
      this.services = ImmutableMap.copyOf(checkNotNull(services, "services"));
   }

   public Map<String, URI> getServices() {
      return services;
   }

NOTE:  Map<String, URI> services is a map of the header name to URI.  This map 
is case sensitive, but it shouldn't be.


Allowable values should be:
        X-Storage-Url
        x-storage-url
        x-StoRage-URl
        etc...




--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to