0
0
mirror of https://github.com/sp-tarkov/modules.git synced 2025-02-13 09:50:43 -05:00
modules/project/Aki.Custom/Utils/BundleManager.cs

110 lines
3.4 KiB
C#
Raw Normal View History

Modernize HTTP v2 (!104) This PR won't affect modders who have already updated their mods to 3.8.0. They just need to re-compile. This is a resubmission of my previous PR (https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/99) with additional code cleanup and fixes. Instead of outright removing the functionality, this time I deprecate it instead (marked for removal in next release). Requires https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/274 to function. ## Overview - HTTP modernization - Adds `Aki.Common.Http.Client`, a replacement for `Aki.Common.Http.Request` and builds on top of `System.Net.Http.HttpClient` - Implements failsafe retries when requesting during busy connections - Improved debugging - Improved performance - Deprecades old request code - Bundle system - Fixes remote downloaded bundles using external IP - Implements functional bundle caching from remote sources - Implements multi-threaded bundle downloads - Implements Unity-compatible bundle format support - Extensive cleanup - Deprecated unneccecary models ## Why? In it's current state, the bundle system is ducktaped together in 2021, fundumentally broken and in desperate need of a cleanup and fixes. The HTTP code hasn't been updated since 2021, and `HttpWebRequest` has been deprecated by Microsoft for a while now. There was also a lot of opportunity left for simple performance gains that even reduces the complexity of the code. As for why not two separate PRs (HTTP modernization, bundle rework): both were deeply interconnected. A change in one requires modification in the other. Hence the current approach. ## Testing The code has been validated and tested by @TheSparta and me. A large section of the code has been implemented and tested extensively by modders. ### Local 1. Start the game from 127.0.0.1 2. The game starts loading bundles from the mods path ### Remote, full re-aquire 1. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 2. Start the game from LAN IP 3. A folder named `user/cache/bundles` is created ### Remote, partial-aquire (deleted) 1. Ensure all bundles are cached 2. Delete one of the aquired bundles from cache 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, partial-aquire (invalid crc) 1. Ensure all bundles are cached 2. Update a bundle mod with a new bundle on the same path 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, use cache 1. Ensure all bundles are cached 2. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 3. Start the game from LAN IP 4. The game starts loading bundles from the cache path ## Risk assessment In order to reduce friction between releases, this PR introduces a deprecation system. Obsolete classes and methods have been marked deprecated. These will remain available for the current release and continue to function as normal for this release. A warning will be displayed during build when a modder relies on the deprecated functionality. The marked classes and methods are to be removed in the next release. The server-side changes have no impact on modders. ## Deprecation The following classes are affected: - `Aki.Common.Http.Request`: Replaced by `Aki.Common.Http.Request` - `Aki.Common.Http.WebConstants`: Replaced by functionality from `System.Net.Http` - `Aki.Custom.Models.BundleInfo`: Replaced by `Aki.Custom.Models.BundleItem` The following methods are affected: - `Aki.Common.Http.RequestHandler.GetData(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.GetJson(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PostJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PutJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. The deprecated methods and `Aki.Custom.Models.BundleInfo` are self-contained and can be removed independently. The deprecated classes require removal of all deprecated code at once. Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/104 Reviewed-by: TheSparta <thesparta@noreply.dev.sp-tarkov.com> Co-authored-by: Merijn Hendriks <merijn.d.hendriks@gmail.com> Co-committed-by: Merijn Hendriks <merijn.d.hendriks@gmail.com>
2024-03-29 18:43:46 +00:00
using System.Collections.Concurrent;
using System.Threading.Tasks;
using BepInEx.Logging;
using Newtonsoft.Json;
2023-03-03 18:52:31 +00:00
using Aki.Common.Http;
using Aki.Common.Utils;
using Aki.Custom.Models;
namespace Aki.Custom.Utils
{
public static class BundleManager
{
Modernize HTTP v2 (!104) This PR won't affect modders who have already updated their mods to 3.8.0. They just need to re-compile. This is a resubmission of my previous PR (https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/99) with additional code cleanup and fixes. Instead of outright removing the functionality, this time I deprecate it instead (marked for removal in next release). Requires https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/274 to function. ## Overview - HTTP modernization - Adds `Aki.Common.Http.Client`, a replacement for `Aki.Common.Http.Request` and builds on top of `System.Net.Http.HttpClient` - Implements failsafe retries when requesting during busy connections - Improved debugging - Improved performance - Deprecades old request code - Bundle system - Fixes remote downloaded bundles using external IP - Implements functional bundle caching from remote sources - Implements multi-threaded bundle downloads - Implements Unity-compatible bundle format support - Extensive cleanup - Deprecated unneccecary models ## Why? In it's current state, the bundle system is ducktaped together in 2021, fundumentally broken and in desperate need of a cleanup and fixes. The HTTP code hasn't been updated since 2021, and `HttpWebRequest` has been deprecated by Microsoft for a while now. There was also a lot of opportunity left for simple performance gains that even reduces the complexity of the code. As for why not two separate PRs (HTTP modernization, bundle rework): both were deeply interconnected. A change in one requires modification in the other. Hence the current approach. ## Testing The code has been validated and tested by @TheSparta and me. A large section of the code has been implemented and tested extensively by modders. ### Local 1. Start the game from 127.0.0.1 2. The game starts loading bundles from the mods path ### Remote, full re-aquire 1. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 2. Start the game from LAN IP 3. A folder named `user/cache/bundles` is created ### Remote, partial-aquire (deleted) 1. Ensure all bundles are cached 2. Delete one of the aquired bundles from cache 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, partial-aquire (invalid crc) 1. Ensure all bundles are cached 2. Update a bundle mod with a new bundle on the same path 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, use cache 1. Ensure all bundles are cached 2. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 3. Start the game from LAN IP 4. The game starts loading bundles from the cache path ## Risk assessment In order to reduce friction between releases, this PR introduces a deprecation system. Obsolete classes and methods have been marked deprecated. These will remain available for the current release and continue to function as normal for this release. A warning will be displayed during build when a modder relies on the deprecated functionality. The marked classes and methods are to be removed in the next release. The server-side changes have no impact on modders. ## Deprecation The following classes are affected: - `Aki.Common.Http.Request`: Replaced by `Aki.Common.Http.Request` - `Aki.Common.Http.WebConstants`: Replaced by functionality from `System.Net.Http` - `Aki.Custom.Models.BundleInfo`: Replaced by `Aki.Custom.Models.BundleItem` The following methods are affected: - `Aki.Common.Http.RequestHandler.GetData(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.GetJson(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PostJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PutJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. The deprecated methods and `Aki.Custom.Models.BundleInfo` are self-contained and can be removed independently. The deprecated classes require removal of all deprecated code at once. Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/104 Reviewed-by: TheSparta <thesparta@noreply.dev.sp-tarkov.com> Co-authored-by: Merijn Hendriks <merijn.d.hendriks@gmail.com> Co-committed-by: Merijn Hendriks <merijn.d.hendriks@gmail.com>
2024-03-29 18:43:46 +00:00
private static ManualLogSource _logger;
public static readonly ConcurrentDictionary<string, BundleItem> Bundles;
public static string CachePath;
2023-03-03 18:52:31 +00:00
static BundleManager()
{
Modernize HTTP v2 (!104) This PR won't affect modders who have already updated their mods to 3.8.0. They just need to re-compile. This is a resubmission of my previous PR (https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/99) with additional code cleanup and fixes. Instead of outright removing the functionality, this time I deprecate it instead (marked for removal in next release). Requires https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/274 to function. ## Overview - HTTP modernization - Adds `Aki.Common.Http.Client`, a replacement for `Aki.Common.Http.Request` and builds on top of `System.Net.Http.HttpClient` - Implements failsafe retries when requesting during busy connections - Improved debugging - Improved performance - Deprecades old request code - Bundle system - Fixes remote downloaded bundles using external IP - Implements functional bundle caching from remote sources - Implements multi-threaded bundle downloads - Implements Unity-compatible bundle format support - Extensive cleanup - Deprecated unneccecary models ## Why? In it's current state, the bundle system is ducktaped together in 2021, fundumentally broken and in desperate need of a cleanup and fixes. The HTTP code hasn't been updated since 2021, and `HttpWebRequest` has been deprecated by Microsoft for a while now. There was also a lot of opportunity left for simple performance gains that even reduces the complexity of the code. As for why not two separate PRs (HTTP modernization, bundle rework): both were deeply interconnected. A change in one requires modification in the other. Hence the current approach. ## Testing The code has been validated and tested by @TheSparta and me. A large section of the code has been implemented and tested extensively by modders. ### Local 1. Start the game from 127.0.0.1 2. The game starts loading bundles from the mods path ### Remote, full re-aquire 1. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 2. Start the game from LAN IP 3. A folder named `user/cache/bundles` is created ### Remote, partial-aquire (deleted) 1. Ensure all bundles are cached 2. Delete one of the aquired bundles from cache 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, partial-aquire (invalid crc) 1. Ensure all bundles are cached 2. Update a bundle mod with a new bundle on the same path 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, use cache 1. Ensure all bundles are cached 2. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 3. Start the game from LAN IP 4. The game starts loading bundles from the cache path ## Risk assessment In order to reduce friction between releases, this PR introduces a deprecation system. Obsolete classes and methods have been marked deprecated. These will remain available for the current release and continue to function as normal for this release. A warning will be displayed during build when a modder relies on the deprecated functionality. The marked classes and methods are to be removed in the next release. The server-side changes have no impact on modders. ## Deprecation The following classes are affected: - `Aki.Common.Http.Request`: Replaced by `Aki.Common.Http.Request` - `Aki.Common.Http.WebConstants`: Replaced by functionality from `System.Net.Http` - `Aki.Custom.Models.BundleInfo`: Replaced by `Aki.Custom.Models.BundleItem` The following methods are affected: - `Aki.Common.Http.RequestHandler.GetData(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.GetJson(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PostJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PutJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. The deprecated methods and `Aki.Custom.Models.BundleInfo` are self-contained and can be removed independently. The deprecated classes require removal of all deprecated code at once. Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/104 Reviewed-by: TheSparta <thesparta@noreply.dev.sp-tarkov.com> Co-authored-by: Merijn Hendriks <merijn.d.hendriks@gmail.com> Co-committed-by: Merijn Hendriks <merijn.d.hendriks@gmail.com>
2024-03-29 18:43:46 +00:00
_logger = Logger.CreateLogSource(nameof(BundleManager));
Bundles = new ConcurrentDictionary<string, BundleItem>();
CachePath = "user/cache/bundles/";
}
2023-03-03 18:52:31 +00:00
Modernize HTTP v2 (!104) This PR won't affect modders who have already updated their mods to 3.8.0. They just need to re-compile. This is a resubmission of my previous PR (https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/99) with additional code cleanup and fixes. Instead of outright removing the functionality, this time I deprecate it instead (marked for removal in next release). Requires https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/274 to function. ## Overview - HTTP modernization - Adds `Aki.Common.Http.Client`, a replacement for `Aki.Common.Http.Request` and builds on top of `System.Net.Http.HttpClient` - Implements failsafe retries when requesting during busy connections - Improved debugging - Improved performance - Deprecades old request code - Bundle system - Fixes remote downloaded bundles using external IP - Implements functional bundle caching from remote sources - Implements multi-threaded bundle downloads - Implements Unity-compatible bundle format support - Extensive cleanup - Deprecated unneccecary models ## Why? In it's current state, the bundle system is ducktaped together in 2021, fundumentally broken and in desperate need of a cleanup and fixes. The HTTP code hasn't been updated since 2021, and `HttpWebRequest` has been deprecated by Microsoft for a while now. There was also a lot of opportunity left for simple performance gains that even reduces the complexity of the code. As for why not two separate PRs (HTTP modernization, bundle rework): both were deeply interconnected. A change in one requires modification in the other. Hence the current approach. ## Testing The code has been validated and tested by @TheSparta and me. A large section of the code has been implemented and tested extensively by modders. ### Local 1. Start the game from 127.0.0.1 2. The game starts loading bundles from the mods path ### Remote, full re-aquire 1. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 2. Start the game from LAN IP 3. A folder named `user/cache/bundles` is created ### Remote, partial-aquire (deleted) 1. Ensure all bundles are cached 2. Delete one of the aquired bundles from cache 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, partial-aquire (invalid crc) 1. Ensure all bundles are cached 2. Update a bundle mod with a new bundle on the same path 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, use cache 1. Ensure all bundles are cached 2. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 3. Start the game from LAN IP 4. The game starts loading bundles from the cache path ## Risk assessment In order to reduce friction between releases, this PR introduces a deprecation system. Obsolete classes and methods have been marked deprecated. These will remain available for the current release and continue to function as normal for this release. A warning will be displayed during build when a modder relies on the deprecated functionality. The marked classes and methods are to be removed in the next release. The server-side changes have no impact on modders. ## Deprecation The following classes are affected: - `Aki.Common.Http.Request`: Replaced by `Aki.Common.Http.Request` - `Aki.Common.Http.WebConstants`: Replaced by functionality from `System.Net.Http` - `Aki.Custom.Models.BundleInfo`: Replaced by `Aki.Custom.Models.BundleItem` The following methods are affected: - `Aki.Common.Http.RequestHandler.GetData(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.GetJson(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PostJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PutJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. The deprecated methods and `Aki.Custom.Models.BundleInfo` are self-contained and can be removed independently. The deprecated classes require removal of all deprecated code at once. Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/104 Reviewed-by: TheSparta <thesparta@noreply.dev.sp-tarkov.com> Co-authored-by: Merijn Hendriks <merijn.d.hendriks@gmail.com> Co-committed-by: Merijn Hendriks <merijn.d.hendriks@gmail.com>
2024-03-29 18:43:46 +00:00
public static string GetBundlePath(BundleItem bundle)
{
return RequestHandler.IsLocal
? $"{bundle.ModPath}/bundles/{bundle.FileName}"
: CachePath + bundle.FileName;
2023-03-03 18:52:31 +00:00
}
public static void GetBundles()
{
Modernize HTTP v2 (!104) This PR won't affect modders who have already updated their mods to 3.8.0. They just need to re-compile. This is a resubmission of my previous PR (https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/99) with additional code cleanup and fixes. Instead of outright removing the functionality, this time I deprecate it instead (marked for removal in next release). Requires https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/274 to function. ## Overview - HTTP modernization - Adds `Aki.Common.Http.Client`, a replacement for `Aki.Common.Http.Request` and builds on top of `System.Net.Http.HttpClient` - Implements failsafe retries when requesting during busy connections - Improved debugging - Improved performance - Deprecades old request code - Bundle system - Fixes remote downloaded bundles using external IP - Implements functional bundle caching from remote sources - Implements multi-threaded bundle downloads - Implements Unity-compatible bundle format support - Extensive cleanup - Deprecated unneccecary models ## Why? In it's current state, the bundle system is ducktaped together in 2021, fundumentally broken and in desperate need of a cleanup and fixes. The HTTP code hasn't been updated since 2021, and `HttpWebRequest` has been deprecated by Microsoft for a while now. There was also a lot of opportunity left for simple performance gains that even reduces the complexity of the code. As for why not two separate PRs (HTTP modernization, bundle rework): both were deeply interconnected. A change in one requires modification in the other. Hence the current approach. ## Testing The code has been validated and tested by @TheSparta and me. A large section of the code has been implemented and tested extensively by modders. ### Local 1. Start the game from 127.0.0.1 2. The game starts loading bundles from the mods path ### Remote, full re-aquire 1. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 2. Start the game from LAN IP 3. A folder named `user/cache/bundles` is created ### Remote, partial-aquire (deleted) 1. Ensure all bundles are cached 2. Delete one of the aquired bundles from cache 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, partial-aquire (invalid crc) 1. Ensure all bundles are cached 2. Update a bundle mod with a new bundle on the same path 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, use cache 1. Ensure all bundles are cached 2. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 3. Start the game from LAN IP 4. The game starts loading bundles from the cache path ## Risk assessment In order to reduce friction between releases, this PR introduces a deprecation system. Obsolete classes and methods have been marked deprecated. These will remain available for the current release and continue to function as normal for this release. A warning will be displayed during build when a modder relies on the deprecated functionality. The marked classes and methods are to be removed in the next release. The server-side changes have no impact on modders. ## Deprecation The following classes are affected: - `Aki.Common.Http.Request`: Replaced by `Aki.Common.Http.Request` - `Aki.Common.Http.WebConstants`: Replaced by functionality from `System.Net.Http` - `Aki.Custom.Models.BundleInfo`: Replaced by `Aki.Custom.Models.BundleItem` The following methods are affected: - `Aki.Common.Http.RequestHandler.GetData(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.GetJson(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PostJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PutJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. The deprecated methods and `Aki.Custom.Models.BundleInfo` are self-contained and can be removed independently. The deprecated classes require removal of all deprecated code at once. Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/104 Reviewed-by: TheSparta <thesparta@noreply.dev.sp-tarkov.com> Co-authored-by: Merijn Hendriks <merijn.d.hendriks@gmail.com> Co-committed-by: Merijn Hendriks <merijn.d.hendriks@gmail.com>
2024-03-29 18:43:46 +00:00
// get bundles
2023-03-03 18:52:31 +00:00
var json = RequestHandler.GetJson("/singleplayer/bundles");
Modernize HTTP v2 (!104) This PR won't affect modders who have already updated their mods to 3.8.0. They just need to re-compile. This is a resubmission of my previous PR (https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/99) with additional code cleanup and fixes. Instead of outright removing the functionality, this time I deprecate it instead (marked for removal in next release). Requires https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/274 to function. ## Overview - HTTP modernization - Adds `Aki.Common.Http.Client`, a replacement for `Aki.Common.Http.Request` and builds on top of `System.Net.Http.HttpClient` - Implements failsafe retries when requesting during busy connections - Improved debugging - Improved performance - Deprecades old request code - Bundle system - Fixes remote downloaded bundles using external IP - Implements functional bundle caching from remote sources - Implements multi-threaded bundle downloads - Implements Unity-compatible bundle format support - Extensive cleanup - Deprecated unneccecary models ## Why? In it's current state, the bundle system is ducktaped together in 2021, fundumentally broken and in desperate need of a cleanup and fixes. The HTTP code hasn't been updated since 2021, and `HttpWebRequest` has been deprecated by Microsoft for a while now. There was also a lot of opportunity left for simple performance gains that even reduces the complexity of the code. As for why not two separate PRs (HTTP modernization, bundle rework): both were deeply interconnected. A change in one requires modification in the other. Hence the current approach. ## Testing The code has been validated and tested by @TheSparta and me. A large section of the code has been implemented and tested extensively by modders. ### Local 1. Start the game from 127.0.0.1 2. The game starts loading bundles from the mods path ### Remote, full re-aquire 1. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 2. Start the game from LAN IP 3. A folder named `user/cache/bundles` is created ### Remote, partial-aquire (deleted) 1. Ensure all bundles are cached 2. Delete one of the aquired bundles from cache 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, partial-aquire (invalid crc) 1. Ensure all bundles are cached 2. Update a bundle mod with a new bundle on the same path 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, use cache 1. Ensure all bundles are cached 2. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 3. Start the game from LAN IP 4. The game starts loading bundles from the cache path ## Risk assessment In order to reduce friction between releases, this PR introduces a deprecation system. Obsolete classes and methods have been marked deprecated. These will remain available for the current release and continue to function as normal for this release. A warning will be displayed during build when a modder relies on the deprecated functionality. The marked classes and methods are to be removed in the next release. The server-side changes have no impact on modders. ## Deprecation The following classes are affected: - `Aki.Common.Http.Request`: Replaced by `Aki.Common.Http.Request` - `Aki.Common.Http.WebConstants`: Replaced by functionality from `System.Net.Http` - `Aki.Custom.Models.BundleInfo`: Replaced by `Aki.Custom.Models.BundleItem` The following methods are affected: - `Aki.Common.Http.RequestHandler.GetData(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.GetJson(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PostJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PutJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. The deprecated methods and `Aki.Custom.Models.BundleInfo` are self-contained and can be removed independently. The deprecated classes require removal of all deprecated code at once. Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/104 Reviewed-by: TheSparta <thesparta@noreply.dev.sp-tarkov.com> Co-authored-by: Merijn Hendriks <merijn.d.hendriks@gmail.com> Co-committed-by: Merijn Hendriks <merijn.d.hendriks@gmail.com>
2024-03-29 18:43:46 +00:00
var bundles = JsonConvert.DeserializeObject<BundleItem[]>(json);
2023-03-03 18:52:31 +00:00
Modernize HTTP v2 (!104) This PR won't affect modders who have already updated their mods to 3.8.0. They just need to re-compile. This is a resubmission of my previous PR (https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/99) with additional code cleanup and fixes. Instead of outright removing the functionality, this time I deprecate it instead (marked for removal in next release). Requires https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/274 to function. ## Overview - HTTP modernization - Adds `Aki.Common.Http.Client`, a replacement for `Aki.Common.Http.Request` and builds on top of `System.Net.Http.HttpClient` - Implements failsafe retries when requesting during busy connections - Improved debugging - Improved performance - Deprecades old request code - Bundle system - Fixes remote downloaded bundles using external IP - Implements functional bundle caching from remote sources - Implements multi-threaded bundle downloads - Implements Unity-compatible bundle format support - Extensive cleanup - Deprecated unneccecary models ## Why? In it's current state, the bundle system is ducktaped together in 2021, fundumentally broken and in desperate need of a cleanup and fixes. The HTTP code hasn't been updated since 2021, and `HttpWebRequest` has been deprecated by Microsoft for a while now. There was also a lot of opportunity left for simple performance gains that even reduces the complexity of the code. As for why not two separate PRs (HTTP modernization, bundle rework): both were deeply interconnected. A change in one requires modification in the other. Hence the current approach. ## Testing The code has been validated and tested by @TheSparta and me. A large section of the code has been implemented and tested extensively by modders. ### Local 1. Start the game from 127.0.0.1 2. The game starts loading bundles from the mods path ### Remote, full re-aquire 1. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 2. Start the game from LAN IP 3. A folder named `user/cache/bundles` is created ### Remote, partial-aquire (deleted) 1. Ensure all bundles are cached 2. Delete one of the aquired bundles from cache 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, partial-aquire (invalid crc) 1. Ensure all bundles are cached 2. Update a bundle mod with a new bundle on the same path 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, use cache 1. Ensure all bundles are cached 2. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 3. Start the game from LAN IP 4. The game starts loading bundles from the cache path ## Risk assessment In order to reduce friction between releases, this PR introduces a deprecation system. Obsolete classes and methods have been marked deprecated. These will remain available for the current release and continue to function as normal for this release. A warning will be displayed during build when a modder relies on the deprecated functionality. The marked classes and methods are to be removed in the next release. The server-side changes have no impact on modders. ## Deprecation The following classes are affected: - `Aki.Common.Http.Request`: Replaced by `Aki.Common.Http.Request` - `Aki.Common.Http.WebConstants`: Replaced by functionality from `System.Net.Http` - `Aki.Custom.Models.BundleInfo`: Replaced by `Aki.Custom.Models.BundleItem` The following methods are affected: - `Aki.Common.Http.RequestHandler.GetData(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.GetJson(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PostJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PutJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. The deprecated methods and `Aki.Custom.Models.BundleInfo` are self-contained and can be removed independently. The deprecated classes require removal of all deprecated code at once. Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/104 Reviewed-by: TheSparta <thesparta@noreply.dev.sp-tarkov.com> Co-authored-by: Merijn Hendriks <merijn.d.hendriks@gmail.com> Co-committed-by: Merijn Hendriks <merijn.d.hendriks@gmail.com>
2024-03-29 18:43:46 +00:00
// register bundles
var toDownload = new ConcurrentBag<BundleItem>();
Parallel.ForEach(bundles, (bundle) =>
2023-03-03 18:52:31 +00:00
{
Modernize HTTP v2 (!104) This PR won't affect modders who have already updated their mods to 3.8.0. They just need to re-compile. This is a resubmission of my previous PR (https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/99) with additional code cleanup and fixes. Instead of outright removing the functionality, this time I deprecate it instead (marked for removal in next release). Requires https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/274 to function. ## Overview - HTTP modernization - Adds `Aki.Common.Http.Client`, a replacement for `Aki.Common.Http.Request` and builds on top of `System.Net.Http.HttpClient` - Implements failsafe retries when requesting during busy connections - Improved debugging - Improved performance - Deprecades old request code - Bundle system - Fixes remote downloaded bundles using external IP - Implements functional bundle caching from remote sources - Implements multi-threaded bundle downloads - Implements Unity-compatible bundle format support - Extensive cleanup - Deprecated unneccecary models ## Why? In it's current state, the bundle system is ducktaped together in 2021, fundumentally broken and in desperate need of a cleanup and fixes. The HTTP code hasn't been updated since 2021, and `HttpWebRequest` has been deprecated by Microsoft for a while now. There was also a lot of opportunity left for simple performance gains that even reduces the complexity of the code. As for why not two separate PRs (HTTP modernization, bundle rework): both were deeply interconnected. A change in one requires modification in the other. Hence the current approach. ## Testing The code has been validated and tested by @TheSparta and me. A large section of the code has been implemented and tested extensively by modders. ### Local 1. Start the game from 127.0.0.1 2. The game starts loading bundles from the mods path ### Remote, full re-aquire 1. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 2. Start the game from LAN IP 3. A folder named `user/cache/bundles` is created ### Remote, partial-aquire (deleted) 1. Ensure all bundles are cached 2. Delete one of the aquired bundles from cache 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, partial-aquire (invalid crc) 1. Ensure all bundles are cached 2. Update a bundle mod with a new bundle on the same path 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, use cache 1. Ensure all bundles are cached 2. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 3. Start the game from LAN IP 4. The game starts loading bundles from the cache path ## Risk assessment In order to reduce friction between releases, this PR introduces a deprecation system. Obsolete classes and methods have been marked deprecated. These will remain available for the current release and continue to function as normal for this release. A warning will be displayed during build when a modder relies on the deprecated functionality. The marked classes and methods are to be removed in the next release. The server-side changes have no impact on modders. ## Deprecation The following classes are affected: - `Aki.Common.Http.Request`: Replaced by `Aki.Common.Http.Request` - `Aki.Common.Http.WebConstants`: Replaced by functionality from `System.Net.Http` - `Aki.Custom.Models.BundleInfo`: Replaced by `Aki.Custom.Models.BundleItem` The following methods are affected: - `Aki.Common.Http.RequestHandler.GetData(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.GetJson(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PostJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PutJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. The deprecated methods and `Aki.Custom.Models.BundleInfo` are self-contained and can be removed independently. The deprecated classes require removal of all deprecated code at once. Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/104 Reviewed-by: TheSparta <thesparta@noreply.dev.sp-tarkov.com> Co-authored-by: Merijn Hendriks <merijn.d.hendriks@gmail.com> Co-committed-by: Merijn Hendriks <merijn.d.hendriks@gmail.com>
2024-03-29 18:43:46 +00:00
Bundles.TryAdd(bundle.FileName, bundle);
2023-03-03 18:52:31 +00:00
Modernize HTTP v2 (!104) This PR won't affect modders who have already updated their mods to 3.8.0. They just need to re-compile. This is a resubmission of my previous PR (https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/99) with additional code cleanup and fixes. Instead of outright removing the functionality, this time I deprecate it instead (marked for removal in next release). Requires https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/274 to function. ## Overview - HTTP modernization - Adds `Aki.Common.Http.Client`, a replacement for `Aki.Common.Http.Request` and builds on top of `System.Net.Http.HttpClient` - Implements failsafe retries when requesting during busy connections - Improved debugging - Improved performance - Deprecades old request code - Bundle system - Fixes remote downloaded bundles using external IP - Implements functional bundle caching from remote sources - Implements multi-threaded bundle downloads - Implements Unity-compatible bundle format support - Extensive cleanup - Deprecated unneccecary models ## Why? In it's current state, the bundle system is ducktaped together in 2021, fundumentally broken and in desperate need of a cleanup and fixes. The HTTP code hasn't been updated since 2021, and `HttpWebRequest` has been deprecated by Microsoft for a while now. There was also a lot of opportunity left for simple performance gains that even reduces the complexity of the code. As for why not two separate PRs (HTTP modernization, bundle rework): both were deeply interconnected. A change in one requires modification in the other. Hence the current approach. ## Testing The code has been validated and tested by @TheSparta and me. A large section of the code has been implemented and tested extensively by modders. ### Local 1. Start the game from 127.0.0.1 2. The game starts loading bundles from the mods path ### Remote, full re-aquire 1. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 2. Start the game from LAN IP 3. A folder named `user/cache/bundles` is created ### Remote, partial-aquire (deleted) 1. Ensure all bundles are cached 2. Delete one of the aquired bundles from cache 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, partial-aquire (invalid crc) 1. Ensure all bundles are cached 2. Update a bundle mod with a new bundle on the same path 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, use cache 1. Ensure all bundles are cached 2. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 3. Start the game from LAN IP 4. The game starts loading bundles from the cache path ## Risk assessment In order to reduce friction between releases, this PR introduces a deprecation system. Obsolete classes and methods have been marked deprecated. These will remain available for the current release and continue to function as normal for this release. A warning will be displayed during build when a modder relies on the deprecated functionality. The marked classes and methods are to be removed in the next release. The server-side changes have no impact on modders. ## Deprecation The following classes are affected: - `Aki.Common.Http.Request`: Replaced by `Aki.Common.Http.Request` - `Aki.Common.Http.WebConstants`: Replaced by functionality from `System.Net.Http` - `Aki.Custom.Models.BundleInfo`: Replaced by `Aki.Custom.Models.BundleItem` The following methods are affected: - `Aki.Common.Http.RequestHandler.GetData(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.GetJson(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PostJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PutJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. The deprecated methods and `Aki.Custom.Models.BundleInfo` are self-contained and can be removed independently. The deprecated classes require removal of all deprecated code at once. Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/104 Reviewed-by: TheSparta <thesparta@noreply.dev.sp-tarkov.com> Co-authored-by: Merijn Hendriks <merijn.d.hendriks@gmail.com> Co-committed-by: Merijn Hendriks <merijn.d.hendriks@gmail.com>
2024-03-29 18:43:46 +00:00
if (ShouldReaquire(bundle))
2023-03-03 18:52:31 +00:00
{
Modernize HTTP v2 (!104) This PR won't affect modders who have already updated their mods to 3.8.0. They just need to re-compile. This is a resubmission of my previous PR (https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/99) with additional code cleanup and fixes. Instead of outright removing the functionality, this time I deprecate it instead (marked for removal in next release). Requires https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/274 to function. ## Overview - HTTP modernization - Adds `Aki.Common.Http.Client`, a replacement for `Aki.Common.Http.Request` and builds on top of `System.Net.Http.HttpClient` - Implements failsafe retries when requesting during busy connections - Improved debugging - Improved performance - Deprecades old request code - Bundle system - Fixes remote downloaded bundles using external IP - Implements functional bundle caching from remote sources - Implements multi-threaded bundle downloads - Implements Unity-compatible bundle format support - Extensive cleanup - Deprecated unneccecary models ## Why? In it's current state, the bundle system is ducktaped together in 2021, fundumentally broken and in desperate need of a cleanup and fixes. The HTTP code hasn't been updated since 2021, and `HttpWebRequest` has been deprecated by Microsoft for a while now. There was also a lot of opportunity left for simple performance gains that even reduces the complexity of the code. As for why not two separate PRs (HTTP modernization, bundle rework): both were deeply interconnected. A change in one requires modification in the other. Hence the current approach. ## Testing The code has been validated and tested by @TheSparta and me. A large section of the code has been implemented and tested extensively by modders. ### Local 1. Start the game from 127.0.0.1 2. The game starts loading bundles from the mods path ### Remote, full re-aquire 1. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 2. Start the game from LAN IP 3. A folder named `user/cache/bundles` is created ### Remote, partial-aquire (deleted) 1. Ensure all bundles are cached 2. Delete one of the aquired bundles from cache 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, partial-aquire (invalid crc) 1. Ensure all bundles are cached 2. Update a bundle mod with a new bundle on the same path 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, use cache 1. Ensure all bundles are cached 2. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 3. Start the game from LAN IP 4. The game starts loading bundles from the cache path ## Risk assessment In order to reduce friction between releases, this PR introduces a deprecation system. Obsolete classes and methods have been marked deprecated. These will remain available for the current release and continue to function as normal for this release. A warning will be displayed during build when a modder relies on the deprecated functionality. The marked classes and methods are to be removed in the next release. The server-side changes have no impact on modders. ## Deprecation The following classes are affected: - `Aki.Common.Http.Request`: Replaced by `Aki.Common.Http.Request` - `Aki.Common.Http.WebConstants`: Replaced by functionality from `System.Net.Http` - `Aki.Custom.Models.BundleInfo`: Replaced by `Aki.Custom.Models.BundleItem` The following methods are affected: - `Aki.Common.Http.RequestHandler.GetData(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.GetJson(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PostJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PutJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. The deprecated methods and `Aki.Custom.Models.BundleInfo` are self-contained and can be removed independently. The deprecated classes require removal of all deprecated code at once. Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/104 Reviewed-by: TheSparta <thesparta@noreply.dev.sp-tarkov.com> Co-authored-by: Merijn Hendriks <merijn.d.hendriks@gmail.com> Co-committed-by: Merijn Hendriks <merijn.d.hendriks@gmail.com>
2024-03-29 18:43:46 +00:00
// mark for download
toDownload.Add(bundle);
2023-03-03 18:52:31 +00:00
}
Modernize HTTP v2 (!104) This PR won't affect modders who have already updated their mods to 3.8.0. They just need to re-compile. This is a resubmission of my previous PR (https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/99) with additional code cleanup and fixes. Instead of outright removing the functionality, this time I deprecate it instead (marked for removal in next release). Requires https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/274 to function. ## Overview - HTTP modernization - Adds `Aki.Common.Http.Client`, a replacement for `Aki.Common.Http.Request` and builds on top of `System.Net.Http.HttpClient` - Implements failsafe retries when requesting during busy connections - Improved debugging - Improved performance - Deprecades old request code - Bundle system - Fixes remote downloaded bundles using external IP - Implements functional bundle caching from remote sources - Implements multi-threaded bundle downloads - Implements Unity-compatible bundle format support - Extensive cleanup - Deprecated unneccecary models ## Why? In it's current state, the bundle system is ducktaped together in 2021, fundumentally broken and in desperate need of a cleanup and fixes. The HTTP code hasn't been updated since 2021, and `HttpWebRequest` has been deprecated by Microsoft for a while now. There was also a lot of opportunity left for simple performance gains that even reduces the complexity of the code. As for why not two separate PRs (HTTP modernization, bundle rework): both were deeply interconnected. A change in one requires modification in the other. Hence the current approach. ## Testing The code has been validated and tested by @TheSparta and me. A large section of the code has been implemented and tested extensively by modders. ### Local 1. Start the game from 127.0.0.1 2. The game starts loading bundles from the mods path ### Remote, full re-aquire 1. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 2. Start the game from LAN IP 3. A folder named `user/cache/bundles` is created ### Remote, partial-aquire (deleted) 1. Ensure all bundles are cached 2. Delete one of the aquired bundles from cache 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, partial-aquire (invalid crc) 1. Ensure all bundles are cached 2. Update a bundle mod with a new bundle on the same path 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, use cache 1. Ensure all bundles are cached 2. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 3. Start the game from LAN IP 4. The game starts loading bundles from the cache path ## Risk assessment In order to reduce friction between releases, this PR introduces a deprecation system. Obsolete classes and methods have been marked deprecated. These will remain available for the current release and continue to function as normal for this release. A warning will be displayed during build when a modder relies on the deprecated functionality. The marked classes and methods are to be removed in the next release. The server-side changes have no impact on modders. ## Deprecation The following classes are affected: - `Aki.Common.Http.Request`: Replaced by `Aki.Common.Http.Request` - `Aki.Common.Http.WebConstants`: Replaced by functionality from `System.Net.Http` - `Aki.Custom.Models.BundleInfo`: Replaced by `Aki.Custom.Models.BundleItem` The following methods are affected: - `Aki.Common.Http.RequestHandler.GetData(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.GetJson(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PostJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PutJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. The deprecated methods and `Aki.Custom.Models.BundleInfo` are self-contained and can be removed independently. The deprecated classes require removal of all deprecated code at once. Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/104 Reviewed-by: TheSparta <thesparta@noreply.dev.sp-tarkov.com> Co-authored-by: Merijn Hendriks <merijn.d.hendriks@gmail.com> Co-committed-by: Merijn Hendriks <merijn.d.hendriks@gmail.com>
2024-03-29 18:43:46 +00:00
});
2023-03-03 18:52:31 +00:00
Modernize HTTP v2 (!104) This PR won't affect modders who have already updated their mods to 3.8.0. They just need to re-compile. This is a resubmission of my previous PR (https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/99) with additional code cleanup and fixes. Instead of outright removing the functionality, this time I deprecate it instead (marked for removal in next release). Requires https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/274 to function. ## Overview - HTTP modernization - Adds `Aki.Common.Http.Client`, a replacement for `Aki.Common.Http.Request` and builds on top of `System.Net.Http.HttpClient` - Implements failsafe retries when requesting during busy connections - Improved debugging - Improved performance - Deprecades old request code - Bundle system - Fixes remote downloaded bundles using external IP - Implements functional bundle caching from remote sources - Implements multi-threaded bundle downloads - Implements Unity-compatible bundle format support - Extensive cleanup - Deprecated unneccecary models ## Why? In it's current state, the bundle system is ducktaped together in 2021, fundumentally broken and in desperate need of a cleanup and fixes. The HTTP code hasn't been updated since 2021, and `HttpWebRequest` has been deprecated by Microsoft for a while now. There was also a lot of opportunity left for simple performance gains that even reduces the complexity of the code. As for why not two separate PRs (HTTP modernization, bundle rework): both were deeply interconnected. A change in one requires modification in the other. Hence the current approach. ## Testing The code has been validated and tested by @TheSparta and me. A large section of the code has been implemented and tested extensively by modders. ### Local 1. Start the game from 127.0.0.1 2. The game starts loading bundles from the mods path ### Remote, full re-aquire 1. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 2. Start the game from LAN IP 3. A folder named `user/cache/bundles` is created ### Remote, partial-aquire (deleted) 1. Ensure all bundles are cached 2. Delete one of the aquired bundles from cache 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, partial-aquire (invalid crc) 1. Ensure all bundles are cached 2. Update a bundle mod with a new bundle on the same path 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, use cache 1. Ensure all bundles are cached 2. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 3. Start the game from LAN IP 4. The game starts loading bundles from the cache path ## Risk assessment In order to reduce friction between releases, this PR introduces a deprecation system. Obsolete classes and methods have been marked deprecated. These will remain available for the current release and continue to function as normal for this release. A warning will be displayed during build when a modder relies on the deprecated functionality. The marked classes and methods are to be removed in the next release. The server-side changes have no impact on modders. ## Deprecation The following classes are affected: - `Aki.Common.Http.Request`: Replaced by `Aki.Common.Http.Request` - `Aki.Common.Http.WebConstants`: Replaced by functionality from `System.Net.Http` - `Aki.Custom.Models.BundleInfo`: Replaced by `Aki.Custom.Models.BundleItem` The following methods are affected: - `Aki.Common.Http.RequestHandler.GetData(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.GetJson(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PostJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PutJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. The deprecated methods and `Aki.Custom.Models.BundleInfo` are self-contained and can be removed independently. The deprecated classes require removal of all deprecated code at once. Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/104 Reviewed-by: TheSparta <thesparta@noreply.dev.sp-tarkov.com> Co-authored-by: Merijn Hendriks <merijn.d.hendriks@gmail.com> Co-committed-by: Merijn Hendriks <merijn.d.hendriks@gmail.com>
2024-03-29 18:43:46 +00:00
if (RequestHandler.IsLocal)
{
// loading from local mods
_logger.LogInfo("CACHE: Loading all bundles from mods on disk.");
return;
2023-03-03 18:52:31 +00:00
}
Modernize HTTP v2 (!104) This PR won't affect modders who have already updated their mods to 3.8.0. They just need to re-compile. This is a resubmission of my previous PR (https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/99) with additional code cleanup and fixes. Instead of outright removing the functionality, this time I deprecate it instead (marked for removal in next release). Requires https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/274 to function. ## Overview - HTTP modernization - Adds `Aki.Common.Http.Client`, a replacement for `Aki.Common.Http.Request` and builds on top of `System.Net.Http.HttpClient` - Implements failsafe retries when requesting during busy connections - Improved debugging - Improved performance - Deprecades old request code - Bundle system - Fixes remote downloaded bundles using external IP - Implements functional bundle caching from remote sources - Implements multi-threaded bundle downloads - Implements Unity-compatible bundle format support - Extensive cleanup - Deprecated unneccecary models ## Why? In it's current state, the bundle system is ducktaped together in 2021, fundumentally broken and in desperate need of a cleanup and fixes. The HTTP code hasn't been updated since 2021, and `HttpWebRequest` has been deprecated by Microsoft for a while now. There was also a lot of opportunity left for simple performance gains that even reduces the complexity of the code. As for why not two separate PRs (HTTP modernization, bundle rework): both were deeply interconnected. A change in one requires modification in the other. Hence the current approach. ## Testing The code has been validated and tested by @TheSparta and me. A large section of the code has been implemented and tested extensively by modders. ### Local 1. Start the game from 127.0.0.1 2. The game starts loading bundles from the mods path ### Remote, full re-aquire 1. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 2. Start the game from LAN IP 3. A folder named `user/cache/bundles` is created ### Remote, partial-aquire (deleted) 1. Ensure all bundles are cached 2. Delete one of the aquired bundles from cache 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, partial-aquire (invalid crc) 1. Ensure all bundles are cached 2. Update a bundle mod with a new bundle on the same path 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, use cache 1. Ensure all bundles are cached 2. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 3. Start the game from LAN IP 4. The game starts loading bundles from the cache path ## Risk assessment In order to reduce friction between releases, this PR introduces a deprecation system. Obsolete classes and methods have been marked deprecated. These will remain available for the current release and continue to function as normal for this release. A warning will be displayed during build when a modder relies on the deprecated functionality. The marked classes and methods are to be removed in the next release. The server-side changes have no impact on modders. ## Deprecation The following classes are affected: - `Aki.Common.Http.Request`: Replaced by `Aki.Common.Http.Request` - `Aki.Common.Http.WebConstants`: Replaced by functionality from `System.Net.Http` - `Aki.Custom.Models.BundleInfo`: Replaced by `Aki.Custom.Models.BundleItem` The following methods are affected: - `Aki.Common.Http.RequestHandler.GetData(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.GetJson(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PostJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PutJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. The deprecated methods and `Aki.Custom.Models.BundleInfo` are self-contained and can be removed independently. The deprecated classes require removal of all deprecated code at once. Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/104 Reviewed-by: TheSparta <thesparta@noreply.dev.sp-tarkov.com> Co-authored-by: Merijn Hendriks <merijn.d.hendriks@gmail.com> Co-committed-by: Merijn Hendriks <merijn.d.hendriks@gmail.com>
2024-03-29 18:43:46 +00:00
else
{
// download bundles
// NOTE: assumes bundle keys to be unique
Parallel.ForEach(toDownload, (bundle) =>
{
// download bundle
var filepath = GetBundlePath(bundle);
var data = RequestHandler.GetData($"/files/bundle/{bundle.FileName}");
VFS.WriteFile(filepath, data);
});
}
}
2023-03-03 18:52:31 +00:00
Modernize HTTP v2 (!104) This PR won't affect modders who have already updated their mods to 3.8.0. They just need to re-compile. This is a resubmission of my previous PR (https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/99) with additional code cleanup and fixes. Instead of outright removing the functionality, this time I deprecate it instead (marked for removal in next release). Requires https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/274 to function. ## Overview - HTTP modernization - Adds `Aki.Common.Http.Client`, a replacement for `Aki.Common.Http.Request` and builds on top of `System.Net.Http.HttpClient` - Implements failsafe retries when requesting during busy connections - Improved debugging - Improved performance - Deprecades old request code - Bundle system - Fixes remote downloaded bundles using external IP - Implements functional bundle caching from remote sources - Implements multi-threaded bundle downloads - Implements Unity-compatible bundle format support - Extensive cleanup - Deprecated unneccecary models ## Why? In it's current state, the bundle system is ducktaped together in 2021, fundumentally broken and in desperate need of a cleanup and fixes. The HTTP code hasn't been updated since 2021, and `HttpWebRequest` has been deprecated by Microsoft for a while now. There was also a lot of opportunity left for simple performance gains that even reduces the complexity of the code. As for why not two separate PRs (HTTP modernization, bundle rework): both were deeply interconnected. A change in one requires modification in the other. Hence the current approach. ## Testing The code has been validated and tested by @TheSparta and me. A large section of the code has been implemented and tested extensively by modders. ### Local 1. Start the game from 127.0.0.1 2. The game starts loading bundles from the mods path ### Remote, full re-aquire 1. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 2. Start the game from LAN IP 3. A folder named `user/cache/bundles` is created ### Remote, partial-aquire (deleted) 1. Ensure all bundles are cached 2. Delete one of the aquired bundles from cache 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, partial-aquire (invalid crc) 1. Ensure all bundles are cached 2. Update a bundle mod with a new bundle on the same path 3. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 4. Start the game from LAN IP 5. The bundle is redownloaded ### Remote, use cache 1. Ensure all bundles are cached 2. Start the server from LAN IP (http.json, set host to `cmd > ipconfig` address, example: `192.168.178.32`) 3. Start the game from LAN IP 4. The game starts loading bundles from the cache path ## Risk assessment In order to reduce friction between releases, this PR introduces a deprecation system. Obsolete classes and methods have been marked deprecated. These will remain available for the current release and continue to function as normal for this release. A warning will be displayed during build when a modder relies on the deprecated functionality. The marked classes and methods are to be removed in the next release. The server-side changes have no impact on modders. ## Deprecation The following classes are affected: - `Aki.Common.Http.Request`: Replaced by `Aki.Common.Http.Request` - `Aki.Common.Http.WebConstants`: Replaced by functionality from `System.Net.Http` - `Aki.Custom.Models.BundleInfo`: Replaced by `Aki.Custom.Models.BundleItem` The following methods are affected: - `Aki.Common.Http.RequestHandler.GetData(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.GetJson(path, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PostJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. - `Aki.Common.Http.RequestHandler.PutJson(path, json, hasHost)`: `hasHost` enables connection outside intended host. The deprecated methods and `Aki.Custom.Models.BundleInfo` are self-contained and can be removed independently. The deprecated classes require removal of all deprecated code at once. Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/104 Reviewed-by: TheSparta <thesparta@noreply.dev.sp-tarkov.com> Co-authored-by: Merijn Hendriks <merijn.d.hendriks@gmail.com> Co-committed-by: Merijn Hendriks <merijn.d.hendriks@gmail.com>
2024-03-29 18:43:46 +00:00
private static bool ShouldReaquire(BundleItem bundle)
{
if (RequestHandler.IsLocal)
{
// only handle remote bundles
return false;
}
// read cache
var filepath = CachePath + bundle.FileName;
if (VFS.Exists(filepath))
{
// calculate hash
var data = VFS.ReadFile(filepath);
var crc = Crc32.Compute(data);
if (crc == bundle.Crc)
{
// file is up-to-date
_logger.LogInfo($"CACHE: Loading locally {bundle.FileName}");
return false;
}
else
{
// crc doesn't match, reaquire the file
_logger.LogInfo($"CACHE: Bundle is invalid, (re-)acquiring {bundle.FileName}");
return true;
}
}
else
{
// file doesn't exist in cache
_logger.LogInfo($"CACHE: Bundle is missing, (re-)acquiring {bundle.FileName}");
return true;
}
2023-03-03 18:52:31 +00:00
}
}
}