85 lines
3.0 KiB
Objective-C
85 lines
3.0 KiB
Objective-C
// Internal helpers for NW HTTP client
|
||
#import <Foundation/Foundation.h>
|
||
#import <Network/Network.h>
|
||
#import <Security/SecTrust.h>
|
||
#import "HttpdnsNWHTTPClient.h"
|
||
|
||
NS_ASSUME_NONNULL_BEGIN
|
||
|
||
typedef NS_ENUM(NSInteger, HttpdnsHTTPHeaderParseResult) {
|
||
HttpdnsHTTPHeaderParseResultIncomplete = 0,
|
||
HttpdnsHTTPHeaderParseResultSuccess,
|
||
HttpdnsHTTPHeaderParseResultError,
|
||
};
|
||
|
||
typedef NS_ENUM(NSInteger, HttpdnsHTTPChunkParseResult) {
|
||
HttpdnsHTTPChunkParseResultIncomplete = 0,
|
||
HttpdnsHTTPChunkParseResultSuccess,
|
||
HttpdnsHTTPChunkParseResultError,
|
||
};
|
||
|
||
@interface HttpdnsNWHTTPClient (Internal)
|
||
|
||
// TLS 验证
|
||
- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust forDomain:(NSString *)domain;
|
||
|
||
// HTTP 头部解析
|
||
- (HttpdnsHTTPHeaderParseResult)tryParseHTTPHeadersInData:(NSData *)data
|
||
headerEndIndex:(nullable NSUInteger *)headerEndIndex
|
||
statusCode:(nullable NSInteger *)statusCode
|
||
headers:(NSDictionary<NSString *, NSString *> *__autoreleasing _Nullable * _Nullable)headers
|
||
error:(NSError * _Nullable * _Nullable)error;
|
||
|
||
// Chunked 编码检<E7A081><E6A380>?
|
||
- (HttpdnsHTTPChunkParseResult)checkChunkedBodyCompletionInData:(NSData *)data
|
||
headerEndIndex:(NSUInteger)headerEndIndex
|
||
error:(NSError * _Nullable * _Nullable)error;
|
||
|
||
// Chunked 编码解码
|
||
- (nullable NSData *)decodeChunkedBody:(NSData *)bodyData error:(NSError * _Nullable * _Nullable)error;
|
||
|
||
// 完整 HTTP 响应解析
|
||
- (BOOL)parseHTTPResponseData:(NSData *)data
|
||
statusCode:(nullable NSInteger *)statusCode
|
||
headers:(NSDictionary<NSString *, NSString *> *__autoreleasing _Nullable * _Nullable)headers
|
||
body:(NSData *__autoreleasing _Nullable * _Nullable)body
|
||
error:(NSError * _Nullable * _Nullable)error;
|
||
|
||
// HTTP 请求构建
|
||
- (NSString *)buildHTTPRequestStringWithURL:(NSURL *)url userAgent:(NSString *)userAgent;
|
||
|
||
// 连接<E8BF9E><E68EA5>?key 生成
|
||
- (NSString *)connectionPoolKeyForHost:(NSString *)host port:(NSString *)port useTLS:(BOOL)useTLS;
|
||
|
||
// 错误转换
|
||
+ (NSError *)errorFromNWError:(nw_error_t)nwError description:(NSString *)description;
|
||
|
||
@end
|
||
|
||
#if DEBUG
|
||
// 测试专用:连接池检<E6B1A0><E6A380>?API
|
||
@interface HttpdnsNWHTTPClient (TestInspection)
|
||
|
||
// 获取指定 pool key 的连接数<E68EA5><E695B0>?
|
||
- (NSUInteger)connectionPoolCountForKey:(NSString *)key;
|
||
|
||
// 获取所有连接池 keys
|
||
- (NSArray<NSString *> *)allConnectionPoolKeys;
|
||
|
||
// 获取连接池总连接数
|
||
- (NSUInteger)totalConnectionCount;
|
||
|
||
// 连接创建计数(用于验证连接复用)
|
||
@property (atomic, assign) NSUInteger connectionCreationCount;
|
||
|
||
// 连接复用计数(用于验证连接复用)
|
||
@property (atomic, assign) NSUInteger connectionReuseCount;
|
||
|
||
// 重置统计计数器(每个测试开始前调用<E8B083><E794A8>?
|
||
- (void)resetPoolStatistics;
|
||
|
||
@end
|
||
#endif
|
||
|
||
NS_ASSUME_NONNULL_END
|