Index: /OpenSceneGraph/trunk/include/osgDB/FileNameUtils
===================================================================
--- /OpenSceneGraph/trunk/include/osgDB/FileNameUtils (revision 8912)
+++ /OpenSceneGraph/trunk/include/osgDB/FileNameUtils (revision 9884)
@@ -41,4 +41,5 @@
 
 extern OSGDB_EXPORT bool containsServerAddress(const std::string& filename);
+extern OSGDB_EXPORT std::string getServerProtocol(const std::string& filename);
 extern OSGDB_EXPORT std::string getServerAddress(const std::string& filename);
 extern OSGDB_EXPORT std::string getServerFileName(const std::string& filename);
Index: /OpenSceneGraph/trunk/include/osgDB/Registry
===================================================================
--- /OpenSceneGraph/trunk/include/osgDB/Registry (revision 9334)
+++ /OpenSceneGraph/trunk/include/osgDB/Registry (revision 9884)
@@ -479,5 +479,11 @@
         /** Add an Archive extension.*/
         void addArchiveExtension(const std::string ext);
-
+        
+        /** registers a protocol */
+        void registerProtocol(const std::string& protocol);
+        
+        /** returns true, if named protocol is registered */
+        bool isProtocolRegistered(const std::string& protocol);
+        
     protected:
 
@@ -492,4 +498,6 @@
         typedef std::map<std::string, ObjectTimeStampPair >             ObjectCache;
         typedef std::map<std::string, osg::ref_ptr<osgDB::Archive> >    ArchiveCache;
+        
+        typedef std::set<std::string>                                   RegisteredProtocolsSet;
 
         /** constructor is private, as its a singleton, preventing
@@ -509,4 +517,6 @@
         
         bool                                        _createNodeFromImage;
+        
+        RegisteredProtocolsSet                      _registeredProtocols;
 
         osg::Object*       readObject(DotOsgWrapperMap& dowMap,Input& fr);
Index: /OpenSceneGraph/trunk/src/osgDB/ReaderWriter.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgDB/ReaderWriter.cpp (revision 8620)
+++ /OpenSceneGraph/trunk/src/osgDB/ReaderWriter.cpp (revision 9884)
@@ -48,4 +48,5 @@
 void ReaderWriter::supportsProtocol(const std::string& fmt, const std::string& description)
 {
+    Registry::instance()->registerProtocol(fmt);
     _supportedProtocols[convertToLowerCase(fmt)] = description;
 }
Index: /OpenSceneGraph/trunk/src/osgDB/FileNameUtils.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgDB/FileNameUtils.cpp (revision 8912)
+++ /OpenSceneGraph/trunk/src/osgDB/FileNameUtils.cpp (revision 9884)
@@ -180,24 +180,40 @@
 }
 
+
+
 bool osgDB::containsServerAddress(const std::string& filename)
 {
-    // need to check for http://
-    if (filename.size()<7) return false;
-    if (filename.compare(0,7,"http://")==0) return true;
-    return false;
+    // need to check for ://
+    std::string::size_type pos(filename.find_first_of("://"));
+    if (pos == std::string::npos) 
+        return false;
+    std::string proto(filename.substr(0, pos));
+    
+    return Registry::instance()->isProtocolRegistered(proto);
+}
+
+std::string osgDB::getServerProtocol(const std::string& filename)
+{
+    std::string::size_type pos(filename.find_first_of("://"));
+    if (pos != std::string::npos)
+        return filename.substr(0,pos);
+
+    return "";
 }
 
 std::string osgDB::getServerAddress(const std::string& filename)
 {
-    if (filename.size()>=7 && filename.compare(0,7,"http://")==0)
-    {
-        std::string::size_type pos_slash = filename.find_first_of('/',7);
+    std::string::size_type pos(filename.find_first_of("://"));
+    
+    if (pos != std::string::npos)
+    {
+        std::string::size_type pos_slash = filename.find_first_of('/',pos+3);
         if (pos_slash!=std::string::npos)
         {
-            return filename.substr(7,pos_slash-7);
+            return filename.substr(pos+3,pos_slash-pos-3);
         }
         else
         {
-            return filename.substr(7,std::string::npos);
+            return filename.substr(pos+3,std::string::npos);
         }
     }
@@ -207,7 +223,9 @@
 std::string osgDB::getServerFileName(const std::string& filename)
 {
-    if (filename.size()>=7 && filename.compare(0,7,"http://")==0)
-    {
-        std::string::size_type pos_slash = filename.find_first_of('/',7);
+    std::string::size_type pos(filename.find_first_of("://"));
+
+    if (pos != std::string::npos)
+    {
+        std::string::size_type pos_slash = filename.find_first_of('/',pos+3);
         if (pos_slash!=std::string::npos)
         {
Index: /OpenSceneGraph/trunk/src/osgDB/Registry.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgDB/Registry.cpp (revision 9881)
+++ /OpenSceneGraph/trunk/src/osgDB/Registry.cpp (revision 9884)
@@ -331,4 +331,7 @@
     addFileExtensionAlias("pgm", "pnm");
     addFileExtensionAlias("ppm", "pnm");
+    
+    // register http-protocol, so the curl can handle it, if necessary
+    registerProtocol("http"); 
     
 }
@@ -2093,2 +2096,14 @@
     return _sharedStateManager.get();
 }
+
+
+void Registry::registerProtocol(const std::string& protocol) 
+{  
+    _registeredProtocols.insert( convertToLowerCase(protocol) ); 
+}
+        
+bool Registry::isProtocolRegistered(const std::string& protocol) 
+{ 
+    return (_registeredProtocols.find( convertToLowerCase(protocol) ) != _registeredProtocols.end()); 
+}
+
