带阿里标识的版本

This commit is contained in:
robin
2026-02-28 18:55:33 +08:00
parent 150799f41d
commit 5d0b7c7e91
477 changed files with 10813 additions and 4044 deletions

View File

@@ -1,9 +1,9 @@
//
// HttpdnsNWHTTPClientTests.m
// AlicloudHttpDNSTests
// TrustHttpDNSTests
//
// @author Created by Claude Code on 2025-11-01
// Copyright © 2025 alibaba-inc.com. All rights reserved.
// Copyright © 2025 trustapp.com. All rights reserved.
//
#import <XCTest/XCTest.h>
@@ -33,7 +33,7 @@
#pragma mark - A. HTTP
#pragma mark - A1. Header (9)
#pragma mark - A1. Header (9<EFBFBD><EFBFBD>?
// A1.1
- (void)testParseHTTPHeaders_ValidResponse_Success {
@@ -88,7 +88,7 @@
XCTAssertEqual(result, HttpdnsHTTPHeaderParseResultSuccess);
XCTAssertEqual(headers.count, testHeaders.count);
// key
// <EFBFBD><EFBFBD>?key
XCTAssertEqualObjects(headers[@"content-type"], @"application/json");
XCTAssertEqualObjects(headers[@"content-length"], @"123");
XCTAssertEqualObjects(headers[@"connection"], @"keep-alive");
@@ -96,7 +96,7 @@
XCTAssertEqualObjects(headers[@"cache-control"], @"no-cache");
}
// A1.3
// A1.3 <EFBFBD><EFBFBD>?
- (void)testParseHTTPHeaders_IncompleteData_ReturnsIncomplete {
NSString *incompleteResponse = @"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n";
NSData *data = [incompleteResponse dataUsingEncoding:NSUTF8StringEncoding];
@@ -152,10 +152,10 @@
error:&error];
XCTAssertEqual(result, HttpdnsHTTPHeaderParseResultSuccess);
XCTAssertEqualObjects(headers[@"content-type"], @"application/json"); // trim
XCTAssertEqualObjects(headers[@"content-type"], @"application/json"); // <EFBFBD><EFBFBD>?trim
}
// A1.6
// A1.6 <EFBFBD><EFBFBD>?
- (void)testParseHTTPHeaders_EmptyHeaderValue_HandledGracefully {
NSString *responseWithEmptyValue = @"HTTP/1.1 200 OK\r\nX-Empty-Header:\r\n\r\n";
NSData *data = [responseWithEmptyValue dataUsingEncoding:NSUTF8StringEncoding];
@@ -175,7 +175,7 @@
XCTAssertEqualObjects(headers[@"x-empty-header"], @"");
}
// A1.7
// A1.7 <EFBFBD><EFBFBD>?
- (void)testParseHTTPHeaders_NonNumericStatusCode_ReturnsError {
NSString *invalidStatusCode = @"HTTP/1.1 ABC OK\r\n\r\n";
NSData *data = [invalidStatusCode dataUsingEncoding:NSUTF8StringEncoding];
@@ -213,7 +213,7 @@
XCTAssertEqual(result, HttpdnsHTTPHeaderParseResultError);
}
// A1.9
// A1.9 <EFBFBD><EFBFBD>?
- (void)testParseHTTPHeaders_HeaderWithoutColon_Skipped {
NSString *responseWithInvalidHeader = @"HTTP/1.1 200 OK\r\nInvalidHeader\r\nContent-Type: application/json\r\n\r\n";
NSData *data = [responseWithInvalidHeader dataUsingEncoding:NSUTF8StringEncoding];
@@ -233,7 +233,7 @@
XCTAssertEqualObjects(headers[@"content-type"], @"application/json"); //
}
#pragma mark - A2. Chunked (8)
#pragma mark - A2. Chunked <EFBFBD><EFBFBD>?(8<EFBFBD><EFBFBD>?
// A2.1 chunk
- (void)testCheckChunkedBody_SingleChunk_DetectsComplete {
@@ -269,9 +269,9 @@
XCTAssertNil(error);
}
// A2.3 chunk
// A2.3 <EFBFBD><EFBFBD>?chunk
- (void)testCheckChunkedBody_IncompleteChunk_ReturnsIncomplete {
NSString *incompleteChunkBody = @"5\r\nhel"; //
NSString *incompleteChunkBody = @"5\r\nhel"; // <EFBFBD><EFBFBD>?
NSString *response = [NSString stringWithFormat:@"HTTP/1.1 200 OK\r\n\r\n%@", incompleteChunkBody];
NSData *data = [response dataUsingEncoding:NSUTF8StringEncoding];
@@ -285,13 +285,13 @@
XCTAssertEqual(result, HttpdnsHTTPChunkParseResultIncomplete);
}
// A2.4 chunk extension
// A2.4 <EFBFBD><EFBFBD>?chunk extension
- (void)testCheckChunkedBody_WithChunkExtension_Ignored {
NSString *chunkWithExtension = @"5;name=value\r\nhello\r\n0\r\n\r\n";
NSString *response = [NSString stringWithFormat:@"HTTP/1.1 200 OK\r\n\r\n%@", chunkWithExtension];
NSData *data = [response dataUsingEncoding:NSUTF8StringEncoding];
// headerEndIndex \r\n\r\n \r
// headerEndIndex <EFBFBD><EFBFBD>?\r\n\r\n <EFBFBD><EFBFBD>?\r
NSUInteger headerEndIndex = [@"HTTP/1.1 200 OK" length];
NSError *error;
@@ -337,9 +337,9 @@
XCTAssertNotNil(error);
}
// A2.7 CRLF
// A2.7 CRLF <EFBFBD><EFBFBD>?
- (void)testCheckChunkedBody_MissingCRLFTerminator_ReturnsError {
NSString *missingTerminator = @"5\r\nhelloXX0\r\n\r\n"; // hello\r\n
NSString *missingTerminator = @"5\r\nhelloXX0\r\n\r\n"; // <EFBFBD><EFBFBD>?hello\r\n
NSString *response = [NSString stringWithFormat:@"HTTP/1.1 200 OK\r\n\r\n%@", missingTerminator];
NSData *data = [response dataUsingEncoding:NSUTF8StringEncoding];
@@ -354,7 +354,7 @@
XCTAssertNotNil(error);
}
// A2.8 trailers
// A2.8 <EFBFBD><EFBFBD>?trailers
- (void)testCheckChunkedBody_WithTrailers_DetectsComplete {
NSString *chunkWithTrailers = @"5\r\nhello\r\n0\r\nX-Trailer: value\r\nX-Custom: test\r\n\r\n";
NSString *response = [NSString stringWithFormat:@"HTTP/1.1 200 OK\r\n\r\n%@", chunkWithTrailers];
@@ -371,7 +371,7 @@
XCTAssertNil(error);
}
#pragma mark - A3. Chunked (2)
#pragma mark - A3. Chunked (2<EFBFBD><EFBFBD>?
// A3.1 chunks
- (void)testDecodeChunkedBody_MultipleChunks_DecodesCorrectly {
@@ -384,7 +384,7 @@
headers:nil
chunks:chunks];
// chunked body headers
// chunked body <EFBFBD><EFBFBD>?headers<EFBFBD><EFBFBD>?
NSData *headerData = [@"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding];
NSData *bodyData = [chunkedData subdataWithRange:NSMakeRange(headerData.length, chunkedData.length - headerData.length)];
@@ -409,7 +409,7 @@
XCTAssertNotNil(error);
}
#pragma mark - A4. (6)
#pragma mark - A4. (6<EFBFBD><EFBFBD>?
// A4.1 Content-Length
- (void)testParseResponse_WithContentLength_ParsesCorrectly {
@@ -467,7 +467,7 @@
XCTAssertEqualObjects(bodyString, @"{\"ips\":[]}");
}
// A4.3 body
// A4.3 <EFBFBD><EFBFBD>?body
- (void)testParseResponse_EmptyBody_Success {
NSData *responseData = [HttpdnsNWHTTPClientTestHelper createHTTPResponseWithStatus:204
statusText:@"No Content"
@@ -490,12 +490,12 @@
XCTAssertEqual(body.length, 0);
}
// A4.4 Content-Length
// A4.4 Content-Length <EFBFBD><EFBFBD>?
- (void)testParseResponse_ContentLengthMismatch_LogsButSucceeds {
NSData *bodyData = [@"short" dataUsingEncoding:NSUTF8StringEncoding];
NSData *responseData = [HttpdnsNWHTTPClientTestHelper createHTTPResponseWithStatus:200
statusText:@"OK"
headers:@{@"Content-Length": @"100"} //
headers:@{@"Content-Length": @"100"} // <EFBFBD><EFBFBD>?
body:bodyData];
NSInteger statusCode;
@@ -509,11 +509,11 @@
body:&body
error:&error];
XCTAssertTrue(success); //
XCTAssertTrue(success); // <EFBFBD><EFBFBD>?
XCTAssertEqualObjects(body, bodyData);
}
// A4.5
// A4.5 <EFBFBD><EFBFBD>?
- (void)testParseResponse_EmptyData_ReturnsError {
NSData *emptyData = [NSData data];
@@ -532,7 +532,7 @@
XCTAssertNotNil(error);
}
// A4.6 headers body
// A4.6 headers <EFBFBD><EFBFBD>?body
- (void)testParseResponse_OnlyHeaders_EmptyBody {
NSData *responseData = [HttpdnsNWHTTPClientTestHelper createHTTPResponseWithStatus:200
statusText:@"OK"
@@ -556,7 +556,7 @@
XCTAssertEqual(body.length, 0);
}
#pragma mark - C. (7)
#pragma mark - C. (7<EFBFBD><EFBFBD>?
// C.1 GET
- (void)testBuildHTTPRequest_BasicGET_CorrectFormat {
@@ -572,7 +572,7 @@
XCTAssertTrue([request hasSuffix:@"\r\n\r\n"]);
}
// C.2
// C.2 <EFBFBD><EFBFBD>?
- (void)testBuildHTTPRequest_WithQueryString_Included {
NSURL *url = [NSURL URLWithString:@"http://example.com/path?foo=bar&baz=qux"];
NSString *request = [self.client buildHTTPRequestStringWithURL:url userAgent:nil];
@@ -588,7 +588,7 @@
XCTAssertTrue([request containsString:@"User-Agent: CustomAgent/1.0\r\n"]);
}
// C.4 HTTP
// C.4 HTTP <EFBFBD><EFBFBD>?
- (void)testBuildHTTPRequest_HTTPDefaultPort_NotInHost {
NSURL *url = [NSURL URLWithString:@"http://example.com:80/"];
NSString *request = [self.client buildHTTPRequestStringWithURL:url userAgent:nil];
@@ -597,7 +597,7 @@
XCTAssertFalse([request containsString:@"Host: example.com:80\r\n"]);
}
// C.5 HTTPS
// C.5 HTTPS <EFBFBD><EFBFBD>?
- (void)testBuildHTTPRequest_HTTPSDefaultPort_NotInHost {
NSURL *url = [NSURL URLWithString:@"https://example.com:443/"];
NSString *request = [self.client buildHTTPRequestStringWithURL:url userAgent:nil];
@@ -606,7 +606,7 @@
XCTAssertFalse([request containsString:@"Host: example.com:443\r\n"]);
}
// C.6
// C.6 <EFBFBD><EFBFBD>?
- (void)testBuildHTTPRequest_NonDefaultPort_InHost {
NSURL *url = [NSURL URLWithString:@"http://example.com:8080/"];
NSString *request = [self.client buildHTTPRequestStringWithURL:url userAgent:nil];
@@ -627,7 +627,7 @@
#pragma mark - E. TLS (4)
// TLS SecTrustRef mock
//
// <EFBFBD><EFBFBD>?
// E.1 YES
- (void)testEvaluateServerTrust_ValidCertificate_ReturnsYES {
@@ -647,10 +647,10 @@
// E.4 使 SSL Policy
- (void)testEvaluateServerTrust_WithDomain_UsesSSLPolicy {
// 使 SecPolicyCreateSSL(true, domain)
// 使<EFBFBD><EFBFBD>?SecPolicyCreateSSL(true, domain)
}
#pragma mark - F. (5)
#pragma mark - F. (5<EFBFBD><EFBFBD>?
// F.1 URL
- (void)testPerformRequest_VeryLongURL_HandlesCorrectly {
@@ -666,7 +666,7 @@
XCTAssertTrue(request.length > 5000);
}
// F.2 User-Agent
// F.2 <EFBFBD><EFBFBD>?User-Agent
- (void)testBuildRequest_EmptyUserAgent_NoUserAgentHeader {
NSURL *url = [NSURL URLWithString:@"http://example.com/"];
NSString *requestWithNil = [self.client buildHTTPRequestStringWithURL:url userAgent:nil];
@@ -674,7 +674,7 @@
XCTAssertFalse([requestWithNil containsString:@"User-Agent:"]);
}
// F.3
// F.3 <EFBFBD><EFBFBD>?
- (void)testParseResponse_VeryLargeBody_HandlesCorrectly {
NSData *largeBody = [HttpdnsNWHTTPClientTestHelper randomDataWithSize:5 * 1024 * 1024];
NSData *responseData = [HttpdnsNWHTTPClientTestHelper createHTTPResponseWithStatus:200
@@ -697,7 +697,7 @@
XCTAssertEqual(body.length, largeBody.length);
}
// F.4 Chunked 退
// F.4 Chunked 退<EFBFBD><EFBFBD>?
- (void)testParseResponse_ChunkedDecodeFails_FallsBackToRaw {
NSString *badChunked = @"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\nBAD_CHUNK_DATA";
NSData *responseData = [badChunked dataUsingEncoding:NSUTF8StringEncoding];
@@ -717,7 +717,7 @@
XCTAssertNotNil(body);
}
// F.5 key
// F.5 <EFBFBD><EFBFBD>?key
- (void)testConnectionPoolKey_DifferentHosts_SeparateKeys {
NSString *key1 = [self.client connectionPoolKeyForHost:@"host1.com" port:@"80" useTLS:NO];
NSString *key2 = [self.client connectionPoolKeyForHost:@"host2.com" port:@"80" useTLS:NO];