44from os import getenv
55
66from asgi_webdav import __version__
7- from asgi_webdav .config import Config
7+ from asgi_webdav .config import Config , Provider
88from asgi_webdav .constants import DAVDepth , DAVMethod , DAVPath , DAVTime
99from asgi_webdav .exception import DAVException , DAVExceptionProviderInitFailed
1010from asgi_webdav .helpers import (
7171_CONTENT_TBODY_FILE_TEMPLATE = """<tr><td><a href="{}">{}</a></td><td>{}</td>
7272<td class="align-right">{}</td><td class="align-right">{}</td></tr>"""
7373
74+ _HTTP_PROVIDERS = {p .type : p for p in [WebHDFSProvider ]}
75+
7476
7577@dataclass
7678class PrefixProviderInfo :
@@ -102,39 +104,33 @@ class WebDAV:
102104
103105 def __init__ (self , config : Config ):
104106 # init prefix => provider
105- for pm in config .provider_mapping :
106- if pm .uri .startswith ("file://" ):
107- provider_factory = FileSystemProvider
108-
109- elif pm .uri .startswith ("http://" ) or pm .uri .startswith ("https://" ):
110- provider_factory = WebHDFSProvider
111-
112- elif pm .uri .startswith ("memory://" ):
113- provider_factory = MemoryProvider
114-
115- else :
116- raise
107+ for p_config in config .provider_mapping :
108+ try :
109+ provider_class = self .match_provider_class (p_config )
110+ except DAVExceptionProviderInitFailed as e :
111+ logger .error (f"{ e } , please check your config, skip!" )
112+ continue
117113
118114 try :
119- provider = provider_factory (
115+ provider = provider_class (
120116 config = config ,
121- prefix = DAVPath (pm .prefix ),
122- uri = pm .uri ,
123- home_dir = pm .home_dir ,
124- read_only = pm .read_only ,
125- ignore_property_extra = pm .ignore_property_extra ,
117+ prefix = DAVPath (p_config .prefix ),
118+ uri = p_config .uri ,
119+ home_dir = p_config .home_dir ,
120+ read_only = p_config .read_only ,
121+ ignore_property_extra = p_config .ignore_property_extra ,
126122 )
127123 except DAVExceptionProviderInitFailed as e :
128- logger .error (f"Provider init failed: { pm } , { e } , skip!" )
124+ logger .error (f"Provider init failed: { p_config } , { e } , skip!" )
129125 continue
130126
131127 ppi = PrefixProviderInfo (
132- prefix = DAVPath (pm .prefix ),
133- prefix_weight = len (pm .prefix ),
128+ prefix = DAVPath (p_config .prefix ),
129+ prefix_weight = len (p_config .prefix ),
134130 provider = provider ,
135- home_dir = pm .home_dir ,
136- read_only = pm .read_only ,
137- ignore_property_extra = pm .ignore_property_extra ,
131+ home_dir = p_config .home_dir ,
132+ read_only = p_config .read_only ,
133+ ignore_property_extra = p_config .ignore_property_extra ,
138134 )
139135 self .prefix_provider_mapping .append (ppi )
140136 logger .info (f"Mapping Prefix: { ppi } " )
@@ -149,12 +145,33 @@ def __init__(self, config: Config):
149145 # init hide file in dir
150146 self ._hide_file_in_dir = DAVHideFileInDir (config )
151147
152- # Please check environment variable
148+ # check environment variable
153149 try :
154150 self .timezone = paser_timezone_key (getenv ("TZ" , "UTC" ))
155151 except DAVException as e :
156152 DAVException (f"Please check environment variable: TZ, { e } " )
157153
154+ @staticmethod
155+ def match_provider_class (
156+ p_config : Provider ,
157+ ) -> type [DAVProvider ]:
158+ if p_config .uri .startswith ("file://" ):
159+ return FileSystemProvider
160+
161+ elif p_config .uri .startswith ("memory://" ):
162+ return MemoryProvider
163+
164+ elif p_config .uri .startswith ("http://" ) or p_config .uri .startswith ("https://" ):
165+ provider_class = _HTTP_PROVIDERS .get (p_config .type )
166+ if provider_class is None :
167+ raise DAVExceptionProviderInitFailed (
168+ f"Provider not found: { p_config } " ,
169+ )
170+
171+ return provider_class
172+
173+ raise DAVExceptionProviderInitFailed (f"Provider uri not supported: { p_config } " )
174+
158175 def match_provider (self , request : DAVRequest ) -> DAVProvider | None :
159176 weight = None
160177 provider = None
0 commit comments