ObjFW  Check-in [2c415002da]

Overview
Comment:OFHTTPClient: Reset client on any exception
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 2c415002da010bc35e5669a699ef83785086c0a4f5cb8fc29e8f4c27d666f345
User & Date: js on 2018-02-25 20:19:48
Other Links: manifest | tags
Context
2018-02-27
20:36
OFHTTP{Client,Server}: Rename body to requestBody check-in: d375061886 user: js tags: trunk
2018-02-25
20:19
OFHTTPClient: Reset client on any exception check-in: 2c415002da user: js tags: trunk
18:10
OFURLHandler_HTTP: Require sockets and threads check-in: f4b11d1e1b user: js tags: trunk
Changes

Modified src/OFHTTPClient.m from [0d10bb98e9] to [b418796944].

280
281
282
283
284
285
286











287
288
289
290
291
292
293
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304







+
+
+
+
+
+
+
+
+
+
+







	[_request release];
	[_context release];
	[_version release];
	[_serverHeaders release];

	[super dealloc];
}

- (void)raiseException: (id)exception
{
	[_client close];
	_client->_inProgress = false;

	[_client->_delegate client: _client
	     didEncounterException: exception
			   request: _request
			   context: _context];
}

- (void)createResponseWithSocketOrThrow: (OFTCPSocket *)sock
{
	OFURL *URL = [_request URL];
	OFHTTPClientResponse *response;
	OFString *connectionHeader;
	bool keepAlive;
413
414
415
416
417
418
419
420
421

422
423
424
425
426
427
428
429
430
424
425
426
427
428
429
430


431


432
433
434
435
436
437
438







-
-
+
-
-







}

- (void)createResponseWithSocket: (OFTCPSocket *)sock
{
	@try {
		[self createResponseWithSocketOrThrow: sock];
	} @catch (id e) {
		[_client->_delegate client: _client
		     didEncounterException: e
		[self raiseException: e];
				   request: _request
				   context: _context];
	}
}

- (bool)handleFirstLine: (OFString *)line
{
	/*
	 * It's possible that the write succeeds on a connection that is
523
524
525
526
527
528
529
530
531

532
533
534
535
536
537
538
539
540
541
542
543
544
545
546

547
548
549
550
551
552
553
554
555
531
532
533
534
535
536
537


538


539
540
541
542
543
544
545
546
547
548
549


550


551
552
553
554
555
556
557







-
-
+
-
-











-
-
+
-
-







	bool ret;

	if (exception != nil) {
		if ([exception isKindOfClass:
		    [OFInvalidEncodingException class]])
			exception = [OFInvalidServerReplyException exception];

		[_client->_delegate client: _client
		     didEncounterException: exception
		[self raiseException: exception];
				   request: _request
				   context: _context];
		return false;
	}

	@try {
		if (_firstLine) {
			_firstLine = false;
			ret = [self handleFirstLine: line];
		} else
			ret = [self handleServerHeader: line
						socket: sock];
	} @catch (id e) {
		[_client->_delegate client: _client
		     didEncounterException: e
		[self raiseException: e];
				   request: _request
				   context: _context];
		ret = false;
	}

	return ret;
}

-  (size_t)socket: (OFTCPSocket *)sock
563
564
565
566
567
568
569
570
571

572
573
574
575
576
577
578
579
580
565
566
567
568
569
570
571


572


573
574
575
576
577
578
579







-
-
+
-
-







		    ([exception errNo] == ECONNRESET ||
		    [exception errNo] == EPIPE)) {
			/* In case a keep-alive connection timed out */
			[self closeAndReconnect];
			return 0;
		}

		[_client->_delegate client: _client
		     didEncounterException: exception
		[self raiseException: exception];
				   request: _request
				   context: _context];
		return 0;
	}

	_firstLine = true;

	if ([[_request headers] objectForKey: @"Content-Length"] != nil) {
		OFStream *stream = [[[OFHTTPClientRequestBodyStream alloc]
620
621
622
623
624
625
626
627
628

629
630
631
632
633
634
635
636
637
638
639
640
641

642
643
644
645
646
647
648
649
650
619
620
621
622
623
624
625


626


627
628
629
630
631
632
633
634
635


636


637
638
639
640
641
642
643







-
-
+
-
-









-
-
+
-
-







		[sock asyncWriteBuffer: UTF8String
				length: UTF8StringLength
				target: self
			      selector: @selector(socket:didWriteRequest:
					    length:context:exception:)
			       context: requestString];
	} @catch (id e) {
		[_client->_delegate client: _client
		     didEncounterException: e
		[self raiseException: e];
				   request: _request
				   context: _context];
		return;
	}
}

- (void)socketDidConnect: (OFTCPSocket *)sock
		 context: (id)context
	       exception: (id)exception
{
	if (exception != nil) {
		[_client->_delegate client: _client
		     didEncounterException: exception
		[self raiseException: exception];
				   request: _request
				   context: _context];
		return;
	}

	if ([_client->_delegate respondsToSelector:
	    @selector(client:didCreateSocket:request:context:)])
		[_client->_delegate client: _client
			   didCreateSocket: sock
659
660
661
662
663
664
665
666
667

668
669
670
671
672
673
674
675
676
652
653
654
655
656
657
658


659


660
661
662
663
664
665
666







-
-
+
-
-







- (bool)throwAwayContent: (OFHTTPClientResponse *)response
		  buffer: (char *)buffer
		  length: (size_t)length
		 context: (OFTCPSocket *)sock
	       exception: (id)exception
{
	if (exception != nil) {
		[_client->_delegate client: _client
		     didEncounterException: exception
		[self raiseException: exception];
				   request: _request
				   context: _context];
		return false;
	}

	if ([response isAtEndOfStream]) {
		[self freeMemory: buffer];

		[_client->_lastResponse release];
759
760
761
762
763
764
765
766
767

768
769
770
771
772
773
774
775
776
749
750
751
752
753
754
755


756


757
758
759
760
761
762
763







-
-
+
-
-







		[sock asyncConnectToHost: [URL host]
				    port: port
				  target: self
				selector: @selector(socketDidConnect:context:
					      exception:)
				 context: nil];
	} @catch (id e) {
		[_client->_delegate client: _client
		     didEncounterException: e
		[self raiseException: e];
				   request: _request
				   context: _context];
	}
}
@end

@implementation OFHTTPClientRequestBodyStream
- (instancetype)initWithHandler: (OFHTTPClientRequestHandler *)handler
			 socket: (OFTCPSocket *)sock