Skip to content

Commit 9423a70

Browse files
authored
Implements URLSessionWebSocketTask (swiftlang#4643)
Implements URLSessionWebSocketTask based on libcurl 7.86.0's recently added WebSocket support. Additional minor fixes for compilation and running on Darwin.
1 parent de5f7ed commit 9423a70

18 files changed

+1072
-137
lines changed

CoreFoundation/URL.subproj/CFURLSessionInterface.c

+77
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
//===----------------------------------------------------------------------===//
2020

2121
#include "CFURLSessionInterface.h"
22+
#include <CoreFoundation/CFInternal.h>
2223
#include <CoreFoundation/CFString.h>
2324
#include <curl/curl.h>
2425

@@ -139,6 +140,61 @@ CFURLSessionEasyCode CFURLSessionInit(void) {
139140
return MakeEasyCode(curl_global_init(CURL_GLOBAL_SSL));
140141
}
141142

143+
#if LIBCURL_VERSION_MAJOR > 7 || (LIBCURL_VERSION_MAJOR == 7 && LIBCURL_VERSION_MINOR >= 86)
144+
145+
Boolean CFURLSessionWebSocketsSupported(void) {
146+
curl_version_info_data *info = curl_version_info(CURLVERSION_NOW);
147+
for (int i = 0; ; i++) {
148+
const char * const protocol = info->protocols[i];
149+
if (protocol == NULL) {
150+
break;
151+
}
152+
if ((0 == strncmp(protocol, "ws", 2)) ||
153+
(0 == strncmp(protocol, "wss", 3))) {
154+
return true;
155+
}
156+
}
157+
return false;
158+
}
159+
160+
CFURLSessionEasyCode CFURLSessionEasyHandleWebSocketsReceive(CFURLSessionEasyHandle _Nonnull handle, char *_Nonnull data, size_t dataLen, size_t * _Nonnull receivedDataLen, CFURLSessionWebSocketsFrame * _Nullable receivedFrame) {
161+
CURLcode retVal = curl_ws_recv(handle, data, dataLen, receivedDataLen, (struct curl_ws_frame **)receivedFrame);
162+
return MakeEasyCode(retVal);
163+
}
164+
165+
CFURLSessionEasyCode CFURLSessionEasyHandleWebSocketsSend(CFURLSessionEasyHandle _Nonnull handle, const char *_Nonnull data, size_t dataLen, size_t * _Nonnull writtenDataLen, long long frameSize, CFURLSessionWebSocketsMessageFlag messageFlags) {
166+
CURLcode retVal = curl_ws_send(handle, data, dataLen, writtenDataLen, frameSize, messageFlags);
167+
return MakeEasyCode(retVal);
168+
}
169+
170+
CFURLSessionWebSocketsFrame * _Nonnull CFURLSessionEasyHandleWebSocketsMetadata(CFURLSessionEasyHandle _Nonnull handle) {
171+
return (CFURLSessionWebSocketsFrame *)curl_ws_meta(handle);
172+
}
173+
174+
#else
175+
176+
Boolean CFURLSessionWebSocketsSupported(void) {
177+
return false;
178+
}
179+
180+
CFURLSessionEasyCode CFURLSessionEasyHandleWebSocketsReceive(CFURLSessionEasyHandle _Nonnull handle, char *_Nonnull data, size_t dataLen, size_t * _Nonnull receivedDataLen, CFURLSessionWebSocketsFrame * _Nullable receivedFrame) {
181+
CFAssert(false, __kCFLogAssertion, "Cannot use WebSockets functions without libcurl >= 7.86.0");
182+
return CFURLSessionEasyCodeNOT_BUILT_IN;
183+
}
184+
CFURLSessionEasyCode CFURLSessionEasyHandleWebSocketsSend(CFURLSessionEasyHandle _Nonnull handle, const char *_Nonnull data, size_t dataLen, size_t * _Nonnull writtenDataLen, long long frameSize, CFURLSessionWebSocketsMessageFlag messageFlags) {
185+
CFAssert(false, __kCFLogAssertion, "Cannot use WebSockets functions without libcurl >= 7.86.0");
186+
return CFURLSessionEasyCodeNOT_BUILT_IN;
187+
}
188+
189+
struct CFURLSessionWebSocketsFrame emptyFrame = { 0, 0, 0, 0 };
190+
191+
CFURLSessionWebSocketsFrame * _Nonnull CFURLSessionEasyHandleWebSocketsMetadata(CFURLSessionEasyHandle _Nonnull handle) {
192+
CFAssert(false, __kCFLogAssertion, "Cannot use WebSockets functions without libcurl >= 7.86.0");
193+
return &emptyFrame;
194+
}
195+
196+
#endif
197+
142198
int const CFURLSessionEasyErrorSize = { CURL_ERROR_SIZE + 1 };
143199

144200
CFURLSessionEasyCode const CFURLSessionEasyCodeOK = { CURLE_OK };
@@ -262,6 +318,27 @@ CFURLSessionProtocol const CFURLSessionProtocolGOPHER = CURLPROTO_GOPHER;
262318
CFURLSessionProtocol const CFURLSessionProtocolALL = CURLPROTO_ALL;
263319

264320

321+
#if LIBCURL_VERSION_MAJOR > 7 || (LIBCURL_VERSION_MAJOR == 7 && LIBCURL_VERSION_MINOR >= 86)
322+
CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsText = CURLWS_TEXT;
323+
CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsBinary = CURLWS_BINARY;
324+
CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsCont = CURLWS_CONT;
325+
CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsClose = CURLWS_CLOSE;
326+
CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsPing = CURLWS_PING;
327+
CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsPong = CURLWS_PONG;
328+
329+
CFURLSessionOption const CFURLSessionWebSocketsRawMode = { CURLWS_RAW_MODE };
330+
#else
331+
CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsText = -1;
332+
CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsBinary = -1;
333+
CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsCont = -1;
334+
CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsClose = -1;
335+
CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsPing = -1;
336+
CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsPong = -1;
337+
338+
CFURLSessionOption const CFURLSessionWebSocketsRawMode = { -1 };
339+
#endif
340+
341+
265342
size_t const CFURLSessionMaxWriteSize = CURL_MAX_WRITE_SIZE;
266343

267344

CoreFoundation/URL.subproj/CFURLSessionInterface.h

+29
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,35 @@ CF_EXPORT CFURLSessionProtocol const CFURLSessionProtocolGOPHER; // CURLPROTO_GO
541541
CF_EXPORT CFURLSessionProtocol const CFURLSessionProtocolALL; // CURLPROTO_ALL
542542

543543

544+
// The following WebSockets symbols are -1 on libcurl < 7.86.0, or when WebSockets are disabled
545+
546+
typedef unsigned int CFURLSessionWebSocketsMessageFlag;
547+
548+
CF_EXPORT CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsText; // CURLWS_TEXT
549+
CF_EXPORT CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsBinary; // CURLWS_BINARY
550+
CF_EXPORT CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsCont; // CURLWS_CONT
551+
CF_EXPORT CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsClose; // CURLWS_CLOSE
552+
CF_EXPORT CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsPing; // CURLWS_PING
553+
CF_EXPORT CFURLSessionWebSocketsMessageFlag const CFURLSessionWebSocketsPong; // CURLWS_PONG
554+
555+
CF_EXPORT CFURLSessionOption const CFURLSessionWebSocketsRawMode; // CURLWS_RAW_MODE
556+
557+
// The following WebSockets functions are functional with libcurl 7.86.0 or later, when WebSockets support is enabled. On libcurl versions without WebSockets support, they'll trap on use. Consult CFURLSessionWebSocketsSupported() to get a runtime signal whether they're functional.
558+
CF_EXPORT Boolean CFURLSessionWebSocketsSupported(void);
559+
560+
typedef struct CFURLSessionWebSocketsFrame {
561+
int age; /* always zero */
562+
CFURLSessionWebSocketsMessageFlag flags;
563+
long long offset;
564+
long long bytesLeft;
565+
} CFURLSessionWebSocketsFrame;
566+
567+
CF_EXPORT CFURLSessionEasyCode CFURLSessionEasyHandleWebSocketsReceive(CFURLSessionEasyHandle _Nonnull handle, char *_Nonnull data, size_t dataLen, size_t * _Nonnull receivedDataLen, CFURLSessionWebSocketsFrame * _Nullable receivedFrame);
568+
CF_EXPORT CFURLSessionEasyCode CFURLSessionEasyHandleWebSocketsSend(CFURLSessionEasyHandle _Nonnull handle, const char *_Nonnull data, size_t dataLen, size_t * _Nonnull writtenDataLen, long long frameSize, CFURLSessionWebSocketsMessageFlag messageFlags);
569+
570+
CF_EXPORT CFURLSessionWebSocketsFrame * _Nonnull CFURLSessionEasyHandleWebSocketsMetadata(CFURLSessionEasyHandle _Nonnull handle);
571+
572+
544573
CF_EXPORT size_t const CFURLSessionMaxWriteSize; // CURL_MAX_WRITE_SIZE
545574

546575
CF_EXPORT char * _Nonnull CFURLSessionCurlVersionString(void);

Docs/API Surface.tasks

+5-5
Original file line numberDiff line numberDiff line change
@@ -9901,9 +9901,9 @@ API Surface:
99019901
- uploadTask(with:fromFile:) @done
99029902
- uploadTask(with:fromFile:completionHandler:) @done
99039903
- uploadTask(withStreamedRequest:) @done
9904-
- webSocketTask(with:)
9905-
- webSocketTask(with:)
9906-
- webSocketTask(with:protocols:)
9904+
- webSocketTask(with:) @done
9905+
- webSocketTask(with:) @done
9906+
- webSocketTask(with:protocols:) @done
99079907
- URLSessionConfiguration
99089908
- allowsCellularAccess @done
99099909
- allowsConstrainedNetworkAccess
@@ -10104,12 +10104,12 @@ API Surface:
1010410104
- URLSessionUploadTask @done
1010510105
- init()
1010610106
- new() @done @unsupported @useSwiftForMemoryManagement
10107-
- URLSessionWebSocketDelegate
10107+
- URLSessionWebSocketDelegate @done
1010810108
- urlSession(_:webSocketTask:didCloseWith:reason:)
1010910109
- Swift.Void
1011010110
- urlSession(_:webSocketTask:didOpenWithProtocol:)
1011110111
- Swift.Void
10112-
- URLSessionWebSocketTask
10112+
- URLSessionWebSocketTask @done
1011310113
- CloseCode
1011410114
- RawValue
1011510115
- abnormalClosure

Foundation.xcodeproj/project.pbxproj

+19-7
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
159884921DCC877700E3314C /* TestHTTPCookieStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 159884911DCC877700E3314C /* TestHTTPCookieStorage.swift */; };
6060
15A619DC245A2895003C8C62 /* libCFXMLInterface.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1550106A22EA24D10088F082 /* libCFXMLInterface.a */; };
6161
15A619E0245A298C003C8C62 /* CFXMLInterface.c in Sources */ = {isa = PBXBuildFile; fileRef = 15A619DF245A298C003C8C62 /* CFXMLInterface.c */; };
62-
15B80388228F376000B30FF6 /* libcurl.3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B1FD9E01D6D178E0080E83C /* libcurl.3.dylib */; };
62+
15B80388228F376000B30FF6 /* libcurl.4.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B1FD9E01D6D178E0080E83C /* libcurl.4.dylib */; };
6363
15B8039E228F376000B30FF6 /* URLProtectionSpace.swift in Sources */ = {isa = PBXBuildFile; fileRef = EADE0B821BD15DFF00C49C64 /* URLProtectionSpace.swift */; };
6464
15B803B4228F376000B30FF6 /* URLCredential.swift in Sources */ = {isa = PBXBuildFile; fileRef = EADE0B7F1BD15DFF00C49C64 /* URLCredential.swift */; };
6565
15B803CF228F376000B30FF6 /* URLAuthenticationChallenge.swift in Sources */ = {isa = PBXBuildFile; fileRef = EADE0B7D1BD15DFF00C49C64 /* URLAuthenticationChallenge.swift */; };
@@ -108,6 +108,7 @@
108108
528776191BF27D9500CB0090 /* Test.plist in Resources */ = {isa = PBXBuildFile; fileRef = 528776181BF27D9500CB0090 /* Test.plist */; };
109109
555683BD1C1250E70041D4C6 /* TestUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 555683BC1C1250E70041D4C6 /* TestUserDefaults.swift */; };
110110
559451EC1F706BFA002807FB /* CFXMLPreferencesDomain.c in Sources */ = {isa = PBXBuildFile; fileRef = 559451EA1F706BF5002807FB /* CFXMLPreferencesDomain.c */; };
111+
5A6AC80C28E7BC8F00A22FA7 /* WebSocketURLProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A6AC80A28E7652D00A22FA7 /* WebSocketURLProtocol.swift */; };
111112
5B0163BB1D024EB7003CCD96 /* DateComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0163BA1D024EB7003CCD96 /* DateComponents.swift */; };
112113
5B13B3251C582D4700651CE2 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA66F6381BF1619600136161 /* main.swift */; };
113114
5B13B3261C582D4C00651CE2 /* TestAffineTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = C93559281C12C49F009FD6A9 /* TestAffineTransform.swift */; };
@@ -154,7 +155,7 @@
154155
5B13B3511C582D4C00651CE2 /* TestByteCountFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A34B551C18C85D00FD972B /* TestByteCountFormatter.swift */; };
155156
5B13B3521C582D4C00651CE2 /* TestNSValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3047AEB1C38BC3300295652 /* TestNSValue.swift */; };
156157
5B1FD9C51D6D16150080E83C /* CFURLSessionInterface.c in Sources */ = {isa = PBXBuildFile; fileRef = 5B1FD9C11D6D160F0080E83C /* CFURLSessionInterface.c */; };
157-
5B1FD9E11D6D178E0080E83C /* libcurl.3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B1FD9E01D6D178E0080E83C /* libcurl.3.dylib */; };
158+
5B1FD9E11D6D178E0080E83C /* libcurl.4.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B1FD9E01D6D178E0080E83C /* libcurl.4.dylib */; };
158159
5B1FD9E31D6D17B80080E83C /* TestURLSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B1FD9E21D6D17B80080E83C /* TestURLSession.swift */; };
159160
5B23AB891CE62D4D000DB898 /* ReferenceConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B23AB881CE62D4D000DB898 /* ReferenceConvertible.swift */; };
160161
5B23AB8B1CE62F9B000DB898 /* PersonNameComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B23AB8A1CE62F9B000DB898 /* PersonNameComponents.swift */; };
@@ -851,11 +852,12 @@
851852
528776181BF27D9500CB0090 /* Test.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Test.plist; sourceTree = "<group>"; };
852853
555683BC1C1250E70041D4C6 /* TestUserDefaults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestUserDefaults.swift; sourceTree = "<group>"; usesTabs = 1; };
853854
559451EA1F706BF5002807FB /* CFXMLPreferencesDomain.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = CFXMLPreferencesDomain.c; sourceTree = "<group>"; };
855+
5A6AC80A28E7652D00A22FA7 /* WebSocketURLProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocketURLProtocol.swift; path = URLSession/WebSocket/WebSocketURLProtocol.swift; sourceTree = "<group>"; };
854856
5B0163BA1D024EB7003CCD96 /* DateComponents.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateComponents.swift; sourceTree = "<group>"; };
855857
5B0C6C211C1E07E600705A0E /* TestNSRegularExpression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestNSRegularExpression.swift; sourceTree = "<group>"; };
856858
5B1FD9C11D6D160F0080E83C /* CFURLSessionInterface.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = CFURLSessionInterface.c; sourceTree = "<group>"; };
857859
5B1FD9C21D6D160F0080E83C /* CFURLSessionInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CFURLSessionInterface.h; sourceTree = "<group>"; };
858-
5B1FD9E01D6D178E0080E83C /* libcurl.3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libcurl.3.dylib; path = usr/lib/libcurl.3.dylib; sourceTree = SDKROOT; };
860+
5B1FD9E01D6D178E0080E83C /* libcurl.4.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libcurl.4.dylib; path = usr/lib/libcurl.4.dylib; sourceTree = SDKROOT; };
859861
5B1FD9E21D6D17B80080E83C /* TestURLSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestURLSession.swift; sourceTree = "<group>"; };
860862
5B23AB861CE62D17000DB898 /* Boxing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Boxing.swift; sourceTree = "<group>"; };
861863
5B23AB881CE62D4D000DB898 /* ReferenceConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReferenceConvertible.swift; sourceTree = "<group>"; };
@@ -1352,7 +1354,7 @@
13521354
buildActionMask = 2147483647;
13531355
files = (
13541356
15FF00CC22934AD7004AD205 /* libCFURLSessionInterface.a in Frameworks */,
1355-
15B80388228F376000B30FF6 /* libcurl.3.dylib in Frameworks */,
1357+
15B80388228F376000B30FF6 /* libcurl.4.dylib in Frameworks */,
13561358
);
13571359
runOnlyForDeploymentPostprocessing = 0;
13581360
};
@@ -1367,7 +1369,7 @@
13671369
isa = PBXFrameworksBuildPhase;
13681370
buildActionMask = 2147483647;
13691371
files = (
1370-
5B1FD9E11D6D178E0080E83C /* libcurl.3.dylib in Frameworks */,
1372+
5B1FD9E11D6D178E0080E83C /* libcurl.4.dylib in Frameworks */,
13711373
5B40F9F41C12524C000E72E3 /* libxml2.dylib in Frameworks */,
13721374
5B7C8B031BEA86A900C5B690 /* libCoreFoundation.a in Frameworks */,
13731375
5B5D89781BBDADDB00234F36 /* libz.dylib in Frameworks */,
@@ -1435,6 +1437,14 @@
14351437
path = AttributedString;
14361438
sourceTree = "<group>";
14371439
};
1440+
5A6AC80728E7649D00A22FA7 /* WebSocket */ = {
1441+
isa = PBXGroup;
1442+
children = (
1443+
5A6AC80A28E7652D00A22FA7 /* WebSocketURLProtocol.swift */,
1444+
);
1445+
name = WebSocket;
1446+
sourceTree = "<group>";
1447+
};
14381448
5B5D88531BBC938800234F36 = {
14391449
isa = PBXGroup;
14401450
children = (
@@ -1784,7 +1794,7 @@
17841794
5B5D89AB1BBDCD0B00234F36 /* Frameworks */ = {
17851795
isa = PBXGroup;
17861796
children = (
1787-
5B1FD9E01D6D178E0080E83C /* libcurl.3.dylib */,
1797+
5B1FD9E01D6D178E0080E83C /* libcurl.4.dylib */,
17881798
5B40F9F31C12524C000E72E3 /* libxml2.dylib */,
17891799
5B5D89751BBDADD300234F36 /* libicucore.dylib */,
17901800
5B5D89791BBDADDF00234F36 /* libobjc.dylib */,
@@ -2266,6 +2276,7 @@
22662276
F023072D23F0B6D70023DBEC /* URLSession */ = {
22672277
isa = PBXGroup;
22682278
children = (
2279+
5A6AC80728E7649D00A22FA7 /* WebSocket */,
22692280
F023073A23F0B7060023DBEC /* libcurl */,
22702281
F023073523F0B6F60023DBEC /* HTTP */,
22712282
F023073223F0B6E90023DBEC /* FTP */,
@@ -2714,7 +2725,7 @@
27142725
};
27152726
5B7C8A6D1BEA7F8F00C5B690 = {
27162727
CreatedOnToolsVersion = 7.2;
2717-
LastSwiftMigration = 1150;
2728+
LastSwiftMigration = 1410;
27182729
ProvisioningStyle = Manual;
27192730
};
27202731
5BDC405B1BD6D83B00ED97BB = {
@@ -2874,6 +2885,7 @@
28742885
buildActionMask = 2147483647;
28752886
files = (
28762887
B91161AA2429860900BD2907 /* DataURLProtocol.swift in Sources */,
2888+
5A6AC80C28E7BC8F00A22FA7 /* WebSocketURLProtocol.swift in Sources */,
28772889
F023073823F0B6FE0023DBEC /* HTTPMessage.swift in Sources */,
28782890
15B8043D228F38A600B30FF6 /* URLCredentialStorage.swift in Sources */,
28792891
F023074023F0B7100023DBEC /* libcurlHelpers.swift in Sources */,

Sources/FoundationNetworking/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ add_library(FoundationNetworking
3636
URLSession/FTP/FTPURLProtocol.swift
3737
URLSession/HTTP/HTTPMessage.swift
3838
URLSession/HTTP/HTTPURLProtocol.swift
39+
URLSession/WebSocket/WebSocketURLProtocol.swift
3940
URLSession/Message.swift
4041
URLSession/NativeProtocol.swift
4142
URLSession/NetworkingSpecific.swift

Sources/FoundationNetworking/Resources/Info.plist

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<key>CFBundleDevelopmentRegion</key>
66
<string>en</string>
77
<key>CFBundleExecutable</key>
8-
<string>SwiftFoundation</string>
8+
<string>SwiftFoundationNetworking</string>
99
<key>CFBundleIdentifier</key>
1010
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
1111
<key>CFBundleInfoDictionaryVersion</key>

0 commit comments

Comments
 (0)