ispectify_http 4.3.4
ispectify_http: ^4.3.4 copied to clipboard
An additional package for http (logging and handling).
Overview #
ISpectify HTTP integrates the http_interceptor package with the ISpectify logging system.
ISpectifyHttp integrates the http_interceptor package with the ISpectify logging system for HTTP request monitoring.
Key Features #
- HTTP Request Logging: Automatic logging of all HTTP requests
- Response Tracking: Detailed response logging with timing information
- Error Handling: Comprehensive error logging with stack traces
- Request Inspection: Headers, body, and parameter logging
- Sensitive Data Redaction: Centralized redaction for headers and bodies (enabled by default, configurable)
- Performance Metrics: Request/response timing and size tracking
- Lightweight: Minimal overhead using http_interceptor package
Configuration Options #
Basic Setup #
final http_interceptor.InterceptedClient client =
http_interceptor.InterceptedClient.build(interceptors: []);
ISpect.run(
() => runApp(MyApp()),
logger: iSpectify,
onInit: () {
client.interceptors.add(
ISpectHttpInterceptor(logger: iSpectify),
);
},
);
Sensitive Data Redaction #
Redaction is enabled by default. Disable globally via settings or provide a custom redactor.
// Disable redaction
client.interceptors.add(
ISpectHttpInterceptor(
logger: iSpectify,
settings: const ISpectHttpInterceptorSettings(enableRedaction: false),
),
);
// Provide a custom redactor
final redactor = RedactionService();
redactor.ignoreKeys(['x-debug']);
redactor.ignoreValues(['sample-token']);
client.interceptors.add(
ISpectHttpInterceptor(
logger: iSpectify,
redactor: redactor,
),
);
File Upload Example #
final List<int> bytes = [1, 2, 3];
const String filename = 'file.txt';
final http_interceptor.MultipartRequest request = http_interceptor.MultipartRequest(
'POST',
Uri.parse('https://api.example.com/upload'),
);
request.files.add(http_interceptor.MultipartFile.fromBytes(
'file',
bytes,
filename: filename,
));
client.send(request);
Installation #
Add ispectify_http to your pubspec.yaml
:
dependencies:
ispectify_http: ^4.3.4
Security & Production Guidelines #
IMPORTANT: ISpect is a debugging tool and should NEVER be included in production builds
Production Safety #
ISpect contains sensitive debugging information and should only be used in development and staging environments. To ensure ISpect is completely removed from production builds, use the following approach:
Recommended Setup with Dart Define Constants #
1. Create environment-aware initialization:
// main.dart
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
// Use dart define to control ISpect inclusion
const bool kEnableISpect = bool.fromEnvironment('ENABLE_ISPECT', defaultValue: false);
void main() {
if (kEnableISpect) {
// Initialize ISpect only in development/staging
_initializeISpect();
} else {
// Production initialization without ISpect
runApp(MyApp());
}
}
void _initializeISpect() {
// ISpect initialization code here
// This entire function will be tree-shaken in production
}
2. Build Commands:
# Development build (includes ISpect)
flutter run --dart-define=ENABLE_ISPECT=true
# Staging build (includes ISpect)
flutter build appbundle --dart-define=ENABLE_ISPECT=true
# Production build (ISpect completely removed via tree-shaking)
flutter build appbundle --dart-define=ENABLE_ISPECT=false
# or simply:
flutter build appbundle # defaults to false
3. Conditional Widget Wrapping:
Widget build(BuildContext context) {
return MaterialApp(
// Conditionally add ISpectBuilder in MaterialApp builder
builder: (context, child) {
if (kEnableISpect) {
return ISpectBuilder(child: child ?? const SizedBox.shrink());
}
return child ?? const SizedBox.shrink();
},
home: Scaffold(/* your app content */),
);
}
Security Benefits #
- Zero Production Footprint: Tree-shaking removes all ISpect code from release builds
- No Sensitive Data Exposure: Debug information never reaches production users
- Performance Optimized: No debugging overhead in production
- Compliance Ready: Meets security requirements for app store releases
π Verification #
To verify ISpect is not included in your production build:
# Build release APK and check size difference
flutter build apk --dart-define=ENABLE_ISPECT=false --release
flutter build apk --dart-define=ENABLE_ISPECT=true --release
# Use flutter tools to analyze bundle
flutter analyze --dart-define=ENABLE_ISPECT=false
π Quick Start #
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:ispect/ispect.dart';
import 'package:http_interceptor/http_interceptor.dart' as http_interceptor;
import 'package:ispectify_http/ispectify_http.dart';
// Use dart define to control ISpectify HTTP integration
const bool kEnableISpectHttp = bool.fromEnvironment('ENABLE_ISPECT', defaultValue: false);
final http_interceptor.InterceptedClient client =
http_interceptor.InterceptedClient.build(interceptors: []);
void main() {
if (kEnableISpectHttp) {
_initializeWithISpect();
} else {
// Production initialization without ISpect
runApp(MyApp());
}
}
void _initializeWithISpect() {
final ISpectify iSpectify = ISpectifyFlutter.init();
ISpect.run(
() => runApp(MyApp()),
logger: iSpectify,
onInit: () {
// Add ISpectify HTTP interceptor only in development/staging
client.interceptors.add(
ISpectHttpInterceptor(
logger: iSpectify,
settings: const ISpectHttpInterceptorSettings(
enableRedaction: true, // Always enable redaction for security
),
),
);
},
);
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('ISpectify HTTP Example')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () async {
// HTTP requests will be logged only when ISpect is enabled
await client.get(
Uri.parse('https://jsonplaceholder.typicode.com/posts/1'),
);
},
child: const Text('Send HTTP Request'),
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () async {
// Error requests are also logged (when enabled)
await client.get(
Uri.parse('https://jsonplaceholder.typicode.com/invalid'),
);
},
child: const Text('Send Error Request'),
),
],
),
),
),
);
}
}
Advanced Configuration #
Production-Safe HTTP Client Setup #
// Create a factory for conditional HTTP client setup
class HttpClientFactory {
static const bool _isEnabled = bool.fromEnvironment('ENABLE_ISPECT', defaultValue: false);
static http_interceptor.InterceptedClient createClient({
ISpectify? iSpectify,
}) {
final List<http_interceptor.InterceptorContract> interceptors = [];
// Only add ISpect interceptor when enabled
if (_isEnabled && iSpectify != null) {
interceptors.add(
ISpectHttpInterceptor(
logger: iSpectify,
settings: const ISpectHttpInterceptorSettings(
enableRedaction: true,
),
),
);
}
return http_interceptor.InterceptedClient.build(
interceptors: interceptors,
);
}
}
// Usage
final client = HttpClientFactory.createClient(
iSpectify: ISpect.logger,
);
Environment-Specific Configuration #
class HttpConfig {
static ISpectHttpInterceptorSettings getSettings() {
const environment = String.fromEnvironment('ENVIRONMENT', defaultValue: 'development');
switch (environment) {
case 'development':
return const ISpectHttpInterceptorSettings(
enableRedaction: false, // Allow full debugging in dev
);
case 'staging':
return const ISpectHttpInterceptorSettings(
enableRedaction: true,
);
default: // production
return const ISpectHttpInterceptorSettings(
enableRedaction: true,
);
}
}
}
Conditional Interceptor Setup #
void setupHttpInterceptors(
http_interceptor.InterceptedClient client,
ISpectify? iSpectify,
) {
const isISpectEnabled = bool.fromEnvironment('ENABLE_ISPECT', defaultValue: false);
if (isISpectEnabled && iSpectify != null) {
// Custom redactor for sensitive data
final redactor = RedactionService();
redactor.ignoreKeys(['authorization', 'x-api-key']);
redactor.ignoreValues(['<placeholder-secret>']);
client.interceptors.add(
ISpectHttpInterceptor(
logger: iSpectify,
redactor: redactor,
settings: HttpConfig.getSettings(),
),
);
}
}
// Close the underlying client if created outside the app lifecycle to free resources.
Examples #
See the example/ directory for complete integration examples with different HTTP client configurations.
ποΈ Architecture #
ISpectifyHttp integrates with the standard HTTP client through interceptors:
Component | Description |
---|---|
HTTP Interceptor | Captures HTTP requests and responses |
Request Logger | Logs request details (headers, body, params) |
Response Logger | Logs response data and timing |
Error Handler | Captures and logs HTTP errors |
Performance Tracker | Measures request/response times |
π€ Contributing #
Contributions are welcome! Please read our contributing guidelines and submit pull requests to the main branch.
π License #
This project is licensed under the MIT License - see the LICENSE file for details.
Related Packages #
- ispectify - Foundation logging system
- ispectify_dio - Dio HTTP client integration
- ispect - Main debugging interface
- http_interceptor - HTTP interceptor package for Dart