Fix: Implement selective TOR routing for internal vs external API calls

**Issue**: Order creation failed because TOR proxy was being used for internal
Docker network API calls to littleshop-admin, causing DNS resolution failures.

**Root Cause**:
- All HTTP clients (BotManager, ActivityTracker, ProductCarousel) used
  Socks5HttpHandler.Create() which checked Privacy:EnableTor globally
- TOR gateway can only proxy external traffic (to Telegram API)
- Internal Docker network calls to littleshop-admin failed through TOR

**Solution**:
- Updated BotManagerService to use Socks5HttpHandler.CreateDirect()
- Updated BotActivityTracker to use Socks5HttpHandler.CreateDirect()
- Updated ProductCarouselService to use Socks5HttpHandler.CreateDirect()
- TelegramBotService continues using TOR for external Telegram API
- LittleShop.Client respects LittleShop:UseTor = false setting

**Architecture**:
 External calls (Telegram API) → TOR for privacy
 Internal calls (LittleShop API) → Direct Docker network connection

**Testing**:
- Bot authenticated successfully with LittleShop API (200 OK)
- Telegram Bot API using TOR proxy (socks5://tor-gateway:9050)
- Container: 45eab050eeeca479680966b45742cf140cf7df0ed8e8ab5dc8c9e3e17739c88a

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
SysAdmin 2025-10-03 13:09:04 +01:00
parent 7e2d8e50db
commit fa5e5fb9fa

View File

@ -90,13 +90,12 @@ builder.Services.AddSingleton<ICommandHandler, CommandHandler>();
builder.Services.AddSingleton<ICallbackHandler, CallbackHandler>(); builder.Services.AddSingleton<ICallbackHandler, CallbackHandler>();
builder.Services.AddSingleton<IMessageHandler, MessageHandler>(); builder.Services.AddSingleton<IMessageHandler, MessageHandler>();
// Bot Manager Service (for registration and metrics) - Single instance with TOR support // Bot Manager Service (for registration and metrics) - Single instance with direct connection (internal API)
builder.Services.AddHttpClient<BotManagerService>() builder.Services.AddHttpClient<BotManagerService>()
.ConfigurePrimaryHttpMessageHandler(sp => .ConfigurePrimaryHttpMessageHandler(sp =>
{ {
var config = sp.GetRequiredService<IConfiguration>(); var logger = sp.GetRequiredService<ILoggerFactory>().CreateLogger("BotManager");
var logger = sp.GetRequiredService<ILoggerFactory>().CreateLogger("TOR.BotManager"); return Socks5HttpHandler.CreateDirect(logger);
return Socks5HttpHandler.Create(config, logger);
}); });
builder.Services.AddSingleton<BotManagerService>(); builder.Services.AddSingleton<BotManagerService>();
builder.Services.AddHostedService(provider => provider.GetRequiredService<BotManagerService>()); builder.Services.AddHostedService(provider => provider.GetRequiredService<BotManagerService>());
@ -106,22 +105,20 @@ builder.Services.AddSingleton<MessageDeliveryService>();
builder.Services.AddSingleton<IMessageDeliveryService>(sp => sp.GetRequiredService<MessageDeliveryService>()); builder.Services.AddSingleton<IMessageDeliveryService>(sp => sp.GetRequiredService<MessageDeliveryService>());
builder.Services.AddHostedService<MessageDeliveryService>(sp => sp.GetRequiredService<MessageDeliveryService>()); builder.Services.AddHostedService<MessageDeliveryService>(sp => sp.GetRequiredService<MessageDeliveryService>());
// Bot Activity Tracking with TOR support // Bot Activity Tracking with direct connection (internal API)
builder.Services.AddHttpClient<IBotActivityTracker, BotActivityTracker>() builder.Services.AddHttpClient<IBotActivityTracker, BotActivityTracker>()
.ConfigurePrimaryHttpMessageHandler(sp => .ConfigurePrimaryHttpMessageHandler(sp =>
{ {
var config = sp.GetRequiredService<IConfiguration>(); var logger = sp.GetRequiredService<ILoggerFactory>().CreateLogger("ActivityTracker");
var logger = sp.GetRequiredService<ILoggerFactory>().CreateLogger("TOR.ActivityTracker"); return Socks5HttpHandler.CreateDirect(logger);
return Socks5HttpHandler.Create(config, logger);
}); });
// Product Carousel Service with TOR support // Product Carousel Service with direct connection (internal API)
builder.Services.AddHttpClient<ProductCarouselService>() builder.Services.AddHttpClient<ProductCarouselService>()
.ConfigurePrimaryHttpMessageHandler(sp => .ConfigurePrimaryHttpMessageHandler(sp =>
{ {
var config = sp.GetRequiredService<IConfiguration>(); var logger = sp.GetRequiredService<ILoggerFactory>().CreateLogger("Carousel");
var logger = sp.GetRequiredService<ILoggerFactory>().CreateLogger("TOR.Carousel"); return Socks5HttpHandler.CreateDirect(logger);
return Socks5HttpHandler.Create(config, logger);
}); });
builder.Services.AddSingleton<IProductCarouselService, ProductCarouselService>(); builder.Services.AddSingleton<IProductCarouselService, ProductCarouselService>();