1
2
3
4
5
6
7
8
9
10
|
1
2
3
4
5
6
7
8
9
10
|
-
-
+
+
|
/*
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015
* Jonathan Schleifer <js@webkeks.org>
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016
* Jonathan Schleifer <js@heap.zone>
*
* 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.
*
|
︙ | | |
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
|
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
|
+
-
+
+
+
+
+
|
freeWhenDone: true];
}
@interface OFHTTPServerResponse: OFHTTPResponse
{
OFTCPSocket *_socket;
OFHTTPServer *_server;
OFHTTPRequest *_request;
bool _chunked, _headersSent;
}
- initWithSocket: (OFTCPSocket*)socket
server: (OFHTTPServer*)server;
server: (OFHTTPServer*)server
request: (OFHTTPRequest*)request;
@end
@implementation OFHTTPServerResponse
- initWithSocket: (OFTCPSocket*)socket
server: (OFHTTPServer*)server
request: (OFHTTPRequest*)request
{
self = [super init];
_statusCode = 500;
_socket = [socket retain];
_server = [server retain];
_request = [request retain];
return self;
}
- (void)dealloc
{
if (_socket != nil)
[self close]; /* includes [_socket release] */
[_server release];
[_request release];
[super dealloc];
}
- (void)OF_sendHeaders
{
void *pool = objc_autoreleasePoolPush();
|
︙ | | |
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
|
268
269
270
271
272
273
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
|
+
-
-
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
|
}
- (void)close
{
if (_socket == nil)
@throw [OFNotOpenException exceptionWithObject: self];
@try {
if (!_headersSent)
[self OF_sendHeaders];
if (!_headersSent)
[self OF_sendHeaders];
if (_chunked)
[_socket writeBuffer: "0\r\n\r\n"
length: 5];
if (_chunked)
[_socket writeBuffer: "0\r\n\r\n"
length: 5];
} @catch (OFWriteFailedException *e) {
id <OFHTTPServerDelegate> delegate = [_server delegate];
if ([delegate respondsToSelector: @selector(server:
didReceiveExceptionForResponse:request:exception:)])
[delegate server: _server
didReceiveExceptionForResponse: self
request: _request
exception: e];
}
[_socket release];
_socket = nil;
}
- (int)fileDescriptorForWriting
{
|
︙ | | |
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
|
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
|
-
+
|
_state = PARSING_HEADERS;
return true;
}
- (bool)parseHeaders: (OFString*)line
{
OFString *key, *value;
OFString *key, *value, *old;
size_t pos;
if ([line length] == 0) {
intmax_t contentLength;
@try {
contentLength = [[_headers
|
︙ | | |
495
496
497
498
499
500
501
502
503
504
505
506
507
508
|
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
|
+
+
+
+
|
key = [line substringWithRange: of_range(0, pos)];
value = [line substringWithRange:
of_range(pos + 1, [line length] - pos - 1)];
key = normalizedKey([key stringByDeletingTrailingWhitespaces]);
value = [value stringByDeletingLeadingWhitespaces];
old = [_headers objectForKey: key];
if (old != nil)
value = [old stringByAppendingFormat: @",%@", value];
[_headers setObject: value
forKey: key];
if ([key isEqual: @"Host"]) {
pos = [value
rangeOfString: @":"
options: OF_STRING_SEARCH_BACKWARDS].location;
|
︙ | | |
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
|
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
|
-
+
+
|
(of_http_request_protocol_version_t){ 1, _HTTPMinorVersion }];
[request setHeaders: _headers];
[request setBody: _body];
[request setRemoteAddress: [_socket remoteAddress]];
response = [[[OFHTTPServerResponse alloc]
initWithSocket: _socket
server: _server] autorelease];
server: _server
request: request] autorelease];
[[_server delegate] server: _server
didReceiveRequest: request
response: response];
}
@end
|
︙ | | |