1
2
3
4
5
6
7
8
9
|
/*
* Copyright (c) 2008-2021 Jonathan Schleifer <js@nil.im>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
|
|
|
1
2
3
4
5
6
7
8
9
|
/*
* Copyright (c) 2008-2022 Jonathan Schleifer <js@nil.im>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
|
︙ | | | ︙ | |
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
#ifdef OF_HAVE_PLUGINS
# import "OFPlugin.h"
#endif
#import "OFSandbox.h"
#import "OFStdIOStream.h"
#import "OFSystemInfo.h"
#import "OFTCPSocket.h"
#import "OFTLSSocket.h"
#import "OFURL.h"
#import "OFConnectionFailedException.h"
#import "OFHTTPRequestFailedException.h"
#import "OFInvalidArgumentException.h"
#import "OFInvalidFormatException.h"
#import "OFInvalidServerReplyException.h"
#import "OFOpenItemFailedException.h"
|
|
>
>
>
>
|
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#ifdef OF_HAVE_PLUGINS
# import "OFPlugin.h"
#endif
#import "OFSandbox.h"
#import "OFStdIOStream.h"
#import "OFSystemInfo.h"
#import "OFTCPSocket.h"
#import "OFTLSStream.h"
#import "OFURL.h"
#ifdef HAVE_TLS_SUPPORT
# import "ObjFWTLS.h"
#endif
#import "OFConnectionFailedException.h"
#import "OFHTTPRequestFailedException.h"
#import "OFInvalidArgumentException.h"
#import "OFInvalidFormatException.h"
#import "OFInvalidServerReplyException.h"
#import "OFOpenItemFailedException.h"
|
︙ | | | ︙ | |
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
OFStream *_output;
unsigned long long _received, _length, _resumedFrom;
ProgressBar *_progressBar;
}
- (void)downloadNextURL;
@end
OF_APPLICATION_DELEGATE(OFHTTP)
static void
help(OFStream *stream, bool full, int status)
{
[OFStdErr writeLine:
|
>
>
>
>
>
>
>
>
|
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
OFStream *_output;
unsigned long long _received, _length, _resumedFrom;
ProgressBar *_progressBar;
}
- (void)downloadNextURL;
@end
#ifdef HAVE_TLS_SUPPORT
void
_reference_to_ObjFWTLS(void)
{
_ObjFWTLS_reference = 1;
}
#endif
OF_APPLICATION_DELEGATE(OFHTTP)
static void
help(OFStream *stream, bool full, int status)
{
[OFStdErr writeLine:
|
︙ | | | ︙ | |
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
|
[fileName retain];
objc_autoreleasePoolPop(pool);
return [fileName autorelease];
}
@implementation OFHTTP
#ifdef OF_HAVE_PLUGINS
+ (void)initialize
{
if (self != [OFHTTP class])
return;
/* Opportunistically try loading ObjOpenSSL and ignore any errors. */
OFDLOpen(@LIB_PREFIX @"objopenssl" @LIB_SUFFIX, OFDLOpenFlagLazy);
}
#endif
- (instancetype)init
{
self = [super init];
@try {
_method = OFHTTPRequestMethodGet;
|
<
<
<
<
<
<
<
<
<
<
<
|
286
287
288
289
290
291
292
293
294
295
296
297
298
299
|
[fileName retain];
objc_autoreleasePoolPop(pool);
return [fileName autorelease];
}
@implementation OFHTTP
- (instancetype)init
{
self = [super init];
@try {
_method = OFHTTPRequestMethodGet;
|
︙ | | | ︙ | |
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
|
[sandbox unveilPath: outputPath
permissions: (_continue ? @"rwc" : @"wc")];
else
[sandbox unveilPath: [[OFFileManager defaultManager]
currentDirectoryPath]
permissions: (_continue ? @"rwc" : @"wc")];
/* In case we use ObjOpenSSL for https later */
[sandbox unveilPath: @"/etc/ssl" permissions: @"r"];
sandbox.allowsUnveil = false;
[OFApplication of_activateSandbox: sandbox];
#endif
_outputPath = [outputPath copy];
|
|
|
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
|
[sandbox unveilPath: outputPath
permissions: (_continue ? @"rwc" : @"wc")];
else
[sandbox unveilPath: [[OFFileManager defaultManager]
currentDirectoryPath]
permissions: (_continue ? @"rwc" : @"wc")];
/* In case we use OpenSSL for HTTPS later */
[sandbox unveilPath: @"/etc/ssl" permissions: @"r"];
sandbox.allowsUnveil = false;
[OFApplication of_activateSandbox: sandbox];
#endif
_outputPath = [outputPath copy];
|
︙ | | | ︙ | |
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
|
@"prog", [OFApplication programName])];
[OFApplication terminateWithStatus: 1];
}
if (_insecure)
_HTTPClient.allowsInsecureRedirects = true;
_useUnicode = ([OFLocale encoding] == OFStringEncodingUTF8);
[self performSelector: @selector(downloadNextURL) afterDelay: 0];
}
- (void)client: (OFHTTPClient *)client
didCreateSocket: (OFTCPSocket *)sock
request: (OFHTTPRequest *)request
{
if (_insecure && [sock respondsToSelector:
@selector(setVerifiesCertificates:)])
((id <OFTLSSocket>)sock).verifiesCertificates = false;
}
- (void)client: (OFHTTPClient *)client
wantsRequestBody: (OFStream *)body
request: (OFHTTPRequest *)request
{
/* TODO: Do asynchronously and print status */
|
>
>
>
>
|
|
|
|
|
<
|
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
|
@"prog", [OFApplication programName])];
[OFApplication terminateWithStatus: 1];
}
if (_insecure)
_HTTPClient.allowsInsecureRedirects = true;
#ifdef OF_WINDOWS
_useUnicode = [OFSystemInfo isWindowsNT];
#else
_useUnicode = ([OFLocale encoding] == OFStringEncodingUTF8);
#endif
[self performSelector: @selector(downloadNextURL) afterDelay: 0];
}
- (void)client: (OFHTTPClient *)client
didCreateTLSStream: (OFTLSStream *)stream
request: (OFHTTPRequest *)request
{
/* Use setter instead of property access to work around GCC bug. */
[stream setVerifiesCertificates: !_insecure];
}
- (void)client: (OFHTTPClient *)client
wantsRequestBody: (OFStream *)body
request: (OFHTTPRequest *)request
{
/* TODO: Do asynchronously and print status */
|
︙ | | | ︙ | |
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
|
@"prog", [OFApplication programName],
@"url", request.URL.string)];
} else if ([exception isKindOfClass:
[OFUnsupportedProtocolException class]]) {
if (!_quiet)
[OFStdOut writeString: @"\n"];
[OFStdErr writeLine: OF_LOCALIZED(@"no_ssl_library",
@"%[prog]: No TLS library loaded!\n"
@" In order to download via https, you need to "
@"preload an TLS library for ObjFW\n"
@" such as ObjOpenSSL!",
@"prog", [OFApplication programName])];
} else if ([exception isKindOfClass:
[OFReadOrWriteFailedException class]]) {
OFString *error = OF_LOCALIZED(
@"download_failed_read_or_write_failed_any",
@"Read or write failed");
|
|
|
|
|
|
>
|
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
|
@"prog", [OFApplication programName],
@"url", request.URL.string)];
} else if ([exception isKindOfClass:
[OFUnsupportedProtocolException class]]) {
if (!_quiet)
[OFStdOut writeString: @"\n"];
[OFStdErr writeLine: OF_LOCALIZED(@"no_tls_support",
@"%[prog]: No TLS support in ObjFW!\n"
@" In order to download via HTTPS, you need to "
@"either build ObjFW with TLS\n"
@" support or preload a library adding TLS "
@"support to ObjFW!",
@"prog", [OFApplication programName])];
} else if ([exception isKindOfClass:
[OFReadOrWriteFailedException class]]) {
OFString *error = OF_LOCALIZED(
@"download_failed_read_or_write_failed_any",
@"Read or write failed");
|
︙ | | | ︙ | |