@@ -154,13 +154,20 @@ func ResolveSubscription(log *logrus.Logger, client *http.Client, configDir stri
154
154
req * http.Request
155
155
resp * http.Response
156
156
)
157
+
158
+ var save_to_file bool = false
159
+
157
160
switch u .Scheme {
158
161
case "file" :
159
162
b , err = ResolveFile (u , configDir )
160
163
if err != nil {
161
164
return "" , nil , err
162
165
}
163
166
goto resolve
167
+ case "http-file" , "https-file" :
168
+ save_to_file = true
169
+ subscription = strings .Replace (subscription , "-file" , "" , 1 )
170
+ break
164
171
default :
165
172
}
166
173
req , err = http .NewRequest ("GET" , subscription , nil )
@@ -170,13 +177,39 @@ func ResolveSubscription(log *logrus.Logger, client *http.Client, configDir stri
170
177
req .Header .Set ("User-Agent" , fmt .Sprintf ("dae/%v (like v2rayA/1.0 WebRequestHelper) (like v2rayN/1.0 WebRequestHelper)" , config .Version ))
171
178
resp , err = client .Do (req )
172
179
if err != nil {
180
+ if save_to_file {
181
+ // fail to fetch, try to read from file
182
+ u .Host = tag + ".sub"
183
+ u .Path = ""
184
+ b , err = ResolveFile (u , configDir )
185
+
186
+ if err != nil {
187
+ return "" , nil , err
188
+ }
189
+ goto resolve
190
+ }
191
+
173
192
return "" , nil , err
174
193
}
175
194
defer resp .Body .Close ()
176
195
b , err = io .ReadAll (resp .Body )
177
196
if err != nil {
178
197
return "" , nil , err
179
198
}
199
+
200
+ if save_to_file {
201
+ path := filepath .Join (configDir , tag + ".sub" )
202
+ file , err := os .OpenFile (path , os .O_CREATE | os .O_WRONLY | os .O_TRUNC , 0600 )
203
+ if err != nil {
204
+ return "" , nil , err
205
+ }
206
+ defer file .Close ()
207
+
208
+ _ , err = file .Write (b )
209
+ if err != nil {
210
+ return "" , nil , err
211
+ }
212
+ }
180
213
resolve:
181
214
if nodes , err = ResolveSubscriptionAsSIP008 (log , b ); err == nil {
182
215
return tag , nodes , nil
0 commit comments