︙ | | | ︙ | |
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
|
} _state;
uint8_t _HTTPMinorVersion;
of_http_request_method_t _method;
OFString *_host, *_path;
uint16_t _port;
OFMutableDictionary *_headers;
size_t _contentLength;
OFDataArray *_POSTData;
}
- initWithSocket: (OFTCPSocket*)socket
server: (OFHTTPServer*)server;
- (bool)socket: (OFTCPSocket*)socket
didReadLine: (OFString*)line
exception: (OFException*)exception;
|
|
|
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
|
} _state;
uint8_t _HTTPMinorVersion;
of_http_request_method_t _method;
OFString *_host, *_path;
uint16_t _port;
OFMutableDictionary *_headers;
size_t _contentLength;
OFDataArray *_entity;
}
- initWithSocket: (OFTCPSocket*)socket
server: (OFHTTPServer*)server;
- (bool)socket: (OFTCPSocket*)socket
didReadLine: (OFString*)line
exception: (OFException*)exception;
|
︙ | | | ︙ | |
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
|
[_timer invalidate];
[_timer release];
[_host release];
[_path release];
[_headers release];
[_POSTData release];
[super dealloc];
}
- (bool)socket: (OFTCPSocket*)socket
didReadLine: (OFString*)line
exception: (OFException*)exception
|
|
|
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
|
[_timer invalidate];
[_timer release];
[_host release];
[_path release];
[_headers release];
[_entity release];
[super dealloc];
}
- (bool)socket: (OFTCPSocket*)socket
didReadLine: (OFString*)line
exception: (OFException*)exception
|
︙ | | | ︙ | |
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
|
method = [line substringWithRange: of_range(0, pos)];
@try {
_method = of_http_request_method_from_string(
[method UTF8String]);
} @catch (OFInvalidFormatException *e) {
return [self sendErrorAndClose: 405];
}
if (_method != OF_HTTP_REQUEST_METHOD_GET &&
_method != OF_HTTP_REQUEST_METHOD_HEAD &&
_method != OF_HTTP_REQUEST_METHOD_POST)
return [self sendErrorAndClose: 405];
@try {
_path = [line substringWithRange:
of_range(pos + 1, [line length] - pos - 10)];
} @catch (OFOutOfRangeException *e) {
return [self sendErrorAndClose: 400];
}
|
<
<
<
<
|
414
415
416
417
418
419
420
421
422
423
424
425
426
427
|
method = [line substringWithRange: of_range(0, pos)];
@try {
_method = of_http_request_method_from_string(
[method UTF8String]);
} @catch (OFInvalidFormatException *e) {
return [self sendErrorAndClose: 405];
}
@try {
_path = [line substringWithRange:
of_range(pos + 1, [line length] - pos - 10)];
} @catch (OFOutOfRangeException *e) {
return [self sendErrorAndClose: 400];
}
|
︙ | | | ︙ | |
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
|
- (bool)parseHeaders: (OFString*)line
{
OFString *key, *value;
size_t pos;
if ([line length] == 0) {
switch (_method) {
case OF_HTTP_REQUEST_METHOD_POST:;
OFString *tmp;
char *buffer;
tmp = [_headers objectForKey: @"Content-Length"];
if (tmp == nil)
return [self sendErrorAndClose: 411];
@try {
_contentLength = (size_t)[tmp decimalValue];
} @catch (OFInvalidFormatException *e) {
return [self sendErrorAndClose: 400];
}
buffer = [self allocMemoryWithSize: BUFFER_SIZE];
_POSTData = [[OFDataArray alloc] init];
[_socket asyncReadIntoBuffer: buffer
length: BUFFER_SIZE
target: self
selector: @selector(socket:
didReadIntoBuffer:
length:exception:)];
[_timer setFireDate:
[OFDate dateWithTimeIntervalSinceNow: 5]];
return false;
default:
_state = SEND_RESPONSE;
break;
}
return true;
}
pos = [line rangeOfString: @":"].location;
if (pos == OF_NOT_FOUND)
return [self sendErrorAndClose: 400];
|
<
<
<
<
|
<
<
<
|
|
>
|
|
|
>
>
>
|
<
<
<
>
|
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
|
- (bool)parseHeaders: (OFString*)line
{
OFString *key, *value;
size_t pos;
if ([line length] == 0) {
size_t contentLength;
@try {
contentLength = [[_headers
objectForKey: @"Content-Length"] decimalValue];
} @catch (OFInvalidFormatException *e) {
return [self sendErrorAndClose: 400];
}
if (contentLength > 0) {
char *buffer;
buffer = [self allocMemoryWithSize: BUFFER_SIZE];
_entity = [[OFDataArray alloc] init];
[_socket asyncReadIntoBuffer: buffer
length: BUFFER_SIZE
target: self
selector: @selector(socket:
didReadIntoBuffer:
length:exception:)];
[_timer setFireDate:
[OFDate dateWithTimeIntervalSinceNow: 5]];
return false;
}
_state = SEND_RESPONSE;
return true;
}
pos = [line rangeOfString: @":"].location;
if (pos == OF_NOT_FOUND)
return [self sendErrorAndClose: 400];
|
︙ | | | ︙ | |
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
|
didReadIntoBuffer: (const char*)buffer
length: (size_t)length
exception: (OFException*)exception
{
if ([socket isAtEndOfStream] || exception != nil)
return false;
[_POSTData addItems: buffer
count: length];
if ([_POSTData count] >= _contentLength) {
@try {
[self createResponse];
} @catch (OFWriteFailedException *e) {
return false;
}
return false;
|
|
|
|
|
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
|
didReadIntoBuffer: (const char*)buffer
length: (size_t)length
exception: (OFException*)exception
{
if ([socket isAtEndOfStream] || exception != nil)
return false;
[_entity addItems: buffer
count: length];
if ([_entity count] >= _contentLength) {
@try {
[self createResponse];
} @catch (OFWriteFailedException *e) {
return false;
}
return false;
|
︙ | | | ︙ | |
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
|
[URL setPath: _path];
request = [OFHTTPRequest requestWithURL: URL];
[request setMethod: _method];
[request setProtocolVersion:
(of_http_request_protocol_version_t){ 1, _HTTPMinorVersion }];
[request setHeaders: _headers];
[request setPOSTData: _POSTData];
[request setRemoteAddress: [_socket remoteAddress]];
response = [[[OFHTTPServerResponse alloc]
initWithSocket: _socket
server: _server] autorelease];
[[_server delegate] server: _server
|
|
|
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
|
[URL setPath: _path];
request = [OFHTTPRequest requestWithURL: URL];
[request setMethod: _method];
[request setProtocolVersion:
(of_http_request_protocol_version_t){ 1, _HTTPMinorVersion }];
[request setHeaders: _headers];
[request setEntity: _entity];
[request setRemoteAddress: [_socket remoteAddress]];
response = [[[OFHTTPServerResponse alloc]
initWithSocket: _socket
server: _server] autorelease];
[[_server delegate] server: _server
|
︙ | | | ︙ | |