Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/Library/DxeHttpIoLib/DxeHttpIoLib.c
- Timestamp:
- Apr 14, 2023 3:17:44 PM (22 months ago)
- Location:
- trunk/src/VBox/Devices/EFI/FirmwareNew
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/EFI/FirmwareNew
-
Property svn:mergeinfo
changed from (toggle deleted branches)
to (toggle deleted branches)/vendor/edk2/current 103735-103757,103769-103776,129194-145445 /vendor/edk2/current 103735-103757,103769-103776,129194-156846
-
Property svn:mergeinfo
changed from (toggle deleted branches)
-
trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/Library/DxeHttpIoLib/DxeHttpIoLib.c
r89983 r99404 27 27 EFIAPI 28 28 HttpIoNotifyDpc ( 29 IN VOID 29 IN VOID *Context 30 30 ) 31 31 { 32 *((BOOLEAN *) 32 *((BOOLEAN *)Context) = TRUE; 33 33 } 34 34 … … 43 43 EFIAPI 44 44 HttpIoNotify ( 45 IN EFI_EVENT 46 IN VOID 45 IN EFI_EVENT Event, 46 IN VOID *Context 47 47 ) 48 48 { … … 61 61 VOID 62 62 HttpIoDestroyIo ( 63 IN HTTP_IO 63 IN HTTP_IO *HttpIo 64 64 ) 65 65 { 66 EFI_HTTP_PROTOCOL 67 EFI_EVENT 66 EFI_HTTP_PROTOCOL *Http; 67 EFI_EVENT Event; 68 68 69 69 if (HttpIo == NULL) { … … 129 129 EFI_STATUS 130 130 HttpIoCreateIo ( 131 IN EFI_HANDLE 132 IN EFI_HANDLE 133 IN UINT8 134 IN HTTP_IO_CONFIG_DATA *ConfigData, OPTIONAL135 IN HTTP_IO_CALLBACK 136 IN VOID 137 OUT HTTP_IO 131 IN EFI_HANDLE Image, 132 IN EFI_HANDLE Controller, 133 IN UINT8 IpVersion, 134 IN HTTP_IO_CONFIG_DATA *ConfigData OPTIONAL, 135 IN HTTP_IO_CALLBACK Callback, 136 IN VOID *Context, 137 OUT HTTP_IO *HttpIo 138 138 ) 139 139 { 140 EFI_STATUS 141 EFI_HTTP_CONFIG_DATA 142 EFI_HTTPv4_ACCESS_POINT 143 EFI_HTTPv6_ACCESS_POINT 144 EFI_HTTP_PROTOCOL 145 EFI_EVENT 140 EFI_STATUS Status; 141 EFI_HTTP_CONFIG_DATA HttpConfigData; 142 EFI_HTTPv4_ACCESS_POINT Http4AccessPoint; 143 EFI_HTTPv6_ACCESS_POINT Http6AccessPoint; 144 EFI_HTTP_PROTOCOL *Http; 145 EFI_EVENT Event; 146 146 147 147 if ((Image == NULL) || (Controller == NULL) || (HttpIo == NULL)) { … … 149 149 } 150 150 151 if ( IpVersion != IP_VERSION_4 && IpVersion != IP_VERSION_6) {151 if ((IpVersion != IP_VERSION_4) && (IpVersion != IP_VERSION_6)) { 152 152 return EFI_UNSUPPORTED; 153 153 } … … 172 172 HttpIo->Handle, 173 173 &gEfiHttpProtocolGuid, 174 (VOID **) 174 (VOID **)&Http, 175 175 Image, 176 176 Controller, … … 184 184 // Init the configuration data and configure the HTTP child. 185 185 // 186 HttpIo->Image 187 HttpIo->Controller 188 HttpIo->IpVersion 189 HttpIo->Http 190 HttpIo->Callback 191 HttpIo->Context 192 HttpIo->Timeout 186 HttpIo->Image = Image; 187 HttpIo->Controller = Controller; 188 HttpIo->IpVersion = IpVersion; 189 HttpIo->Http = Http; 190 HttpIo->Callback = Callback; 191 HttpIo->Context = Context; 192 HttpIo->Timeout = PcdGet32 (PcdHttpIoTimeout); 193 193 194 194 if (ConfigData != NULL) { 195 195 if (HttpIo->IpVersion == IP_VERSION_4) { 196 HttpConfigData.LocalAddressIsIPv6 197 HttpConfigData.HttpVersion 198 HttpConfigData.TimeOutMillisec 196 HttpConfigData.LocalAddressIsIPv6 = FALSE; 197 HttpConfigData.HttpVersion = ConfigData->Config4.HttpVersion; 198 HttpConfigData.TimeOutMillisec = ConfigData->Config4.RequestTimeOut; 199 199 200 200 Http4AccessPoint.UseDefaultAddress = ConfigData->Config4.UseDefaultAddress; … … 205 205 } else { 206 206 HttpConfigData.LocalAddressIsIPv6 = TRUE; 207 HttpConfigData.HttpVersion 208 HttpConfigData.TimeOutMillisec 209 210 Http6AccessPoint.LocalPort 207 HttpConfigData.HttpVersion = ConfigData->Config6.HttpVersion; 208 HttpConfigData.TimeOutMillisec = ConfigData->Config6.RequestTimeOut; 209 210 Http6AccessPoint.LocalPort = ConfigData->Config6.LocalPort; 211 211 IP6_COPY_ADDRESS (&Http6AccessPoint.LocalAddress, &ConfigData->Config6.LocalIp); 212 212 HttpConfigData.AccessPoint.IPv6Node = &Http6AccessPoint; … … 232 232 goto ON_ERROR; 233 233 } 234 HttpIo->ReqToken.Event = Event; 234 235 HttpIo->ReqToken.Event = Event; 235 236 HttpIo->ReqToken.Message = &HttpIo->ReqMessage; 236 237 … … 245 246 goto ON_ERROR; 246 247 } 247 HttpIo->RspToken.Event = Event; 248 249 HttpIo->RspToken.Event = Event; 248 250 HttpIo->RspToken.Message = &HttpIo->RspMessage; 249 251 … … 261 263 goto ON_ERROR; 262 264 } 265 263 266 HttpIo->TimeoutEvent = Event; 264 267 return EFI_SUCCESS; … … 297 300 ) 298 301 { 299 EFI_STATUS 300 EFI_HTTP_PROTOCOL 301 302 if ( HttpIo == NULL || HttpIo->Http == NULL) {302 EFI_STATUS Status; 303 EFI_HTTP_PROTOCOL *Http; 304 305 if ((HttpIo == NULL) || (HttpIo->Http == NULL)) { 303 306 return EFI_INVALID_PARAMETER; 304 307 } 305 308 306 HttpIo->ReqToken.Status = EFI_NOT_READY;309 HttpIo->ReqToken.Status = EFI_NOT_READY; 307 310 HttpIo->ReqToken.Message->Data.Request = Request; 308 311 HttpIo->ReqToken.Message->HeaderCount = HeaderCount; … … 313 316 if (HttpIo->Callback != NULL) { 314 317 Status = HttpIo->Callback ( 315 HttpIoRequest,316 HttpIo->ReqToken.Message,317 HttpIo->Context318 );318 HttpIoRequest, 319 HttpIo->ReqToken.Message, 320 HttpIo->Context 321 ); 319 322 if (EFI_ERROR (Status)) { 320 323 return Status; … … 325 328 // Queue the request token to HTTP instances. 326 329 // 327 Http = HttpIo->Http;330 Http = HttpIo->Http; 328 331 HttpIo->IsTxDone = FALSE; 329 Status = Http->Request (330 Http,331 &HttpIo->ReqToken332 );332 Status = Http->Request ( 333 Http, 334 &HttpIo->ReqToken 335 ); 333 336 if (EFI_ERROR (Status)) { 334 337 return Status; … … 362 365 EFI_STATUS 363 366 HttpIoRecvResponse ( 364 IN HTTP_IO 365 IN BOOLEAN 366 OUT HTTP_IO_RESPONSE_DATA 367 IN HTTP_IO *HttpIo, 368 IN BOOLEAN RecvMsgHeader, 369 OUT HTTP_IO_RESPONSE_DATA *ResponseData 367 370 ) 368 371 { 369 EFI_STATUS 370 EFI_HTTP_PROTOCOL 371 372 if ( HttpIo == NULL || HttpIo->Http == NULL || ResponseData == NULL) {372 EFI_STATUS Status; 373 EFI_HTTP_PROTOCOL *Http; 374 375 if ((HttpIo == NULL) || (HttpIo->Http == NULL) || (ResponseData == NULL)) { 373 376 return EFI_INVALID_PARAMETER; 374 377 } … … 377 380 // Queue the response token to HTTP instances. 378 381 // 379 HttpIo->RspToken.Status 382 HttpIo->RspToken.Status = EFI_NOT_READY; 380 383 if (RecvMsgHeader) { 381 384 HttpIo->RspToken.Message->Data.Response = &ResponseData->Response; … … 383 386 HttpIo->RspToken.Message->Data.Response = NULL; 384 387 } 385 HttpIo->RspToken.Message->HeaderCount = 0; 386 HttpIo->RspToken.Message->Headers = NULL; 387 HttpIo->RspToken.Message->BodyLength = ResponseData->BodyLength; 388 HttpIo->RspToken.Message->Body = ResponseData->Body; 389 390 Http = HttpIo->Http; 388 389 HttpIo->RspToken.Message->HeaderCount = 0; 390 HttpIo->RspToken.Message->Headers = NULL; 391 HttpIo->RspToken.Message->BodyLength = ResponseData->BodyLength; 392 HttpIo->RspToken.Message->Body = ResponseData->Body; 393 394 Http = HttpIo->Http; 391 395 HttpIo->IsRxDone = FALSE; 392 396 … … 438 442 439 443 if ((HttpIo->Callback != NULL) && 440 (HttpIo->RspToken.Status == EFI_SUCCESS || HttpIo->RspToken.Status == EFI_HTTP_ERROR)) { 444 ((HttpIo->RspToken.Status == EFI_SUCCESS) || (HttpIo->RspToken.Status == EFI_HTTP_ERROR))) 445 { 441 446 Status = HttpIo->Callback ( 442 HttpIoResponse,443 HttpIo->RspToken.Message,444 HttpIo->Context445 );447 HttpIoResponse, 448 HttpIo->RspToken.Message, 449 HttpIo->Context 450 ); 446 451 if (EFI_ERROR (Status)) { 447 452 return Status; … … 452 457 // Store the received data into the wrapper. 453 458 // 454 ResponseData->Status = HttpIo->RspToken.Status;459 ResponseData->Status = HttpIo->RspToken.Status; 455 460 ResponseData->HeaderCount = HttpIo->RspToken.Message->HeaderCount; 456 461 ResponseData->Headers = HttpIo->RspToken.Message->Headers; … … 473 478 EFI_STATUS 474 479 HttpIoGetContentLength ( 475 IN UINTN 476 IN EFI_HTTP_HEADER 477 OUT UINTN 480 IN UINTN HeaderCount, 481 IN EFI_HTTP_HEADER *Headers, 482 OUT UINTN *ContentLength 478 483 ) 479 484 { 480 EFI_HTTP_HEADER 485 EFI_HTTP_HEADER *Header; 481 486 482 487 Header = HttpFindHeader (HeaderCount, Headers, HTTP_HEADER_CONTENT_LENGTH); … … 485 490 } 486 491 487 return AsciiStrDecimalToUintnS (Header->FieldValue, (CHAR8 **) 492 return AsciiStrDecimalToUintnS (Header->FieldValue, (CHAR8 **)NULL, ContentLength); 488 493 } 494 489 495 /** 490 496 Send HTTP request in chunks. … … 500 506 EFI_STATUS 501 507 HttpIoSendChunkedTransfer ( 502 IN HTTP_IO *HttpIo,503 IN HTTP_IO_SEND_CHUNK_PROCESS *SendChunkProcess,504 IN EFI_HTTP_MESSAGE *RequestMessage505 )508 IN HTTP_IO *HttpIo, 509 IN HTTP_IO_SEND_CHUNK_PROCESS *SendChunkProcess, 510 IN EFI_HTTP_MESSAGE *RequestMessage 511 ) 506 512 { 507 EFI_STATUS Status;508 EFI_HTTP_HEADER *NewHeaders;509 EFI_HTTP_HEADER *ContentLengthHeader;510 UINTN AddNewHeader;511 UINTN HeaderCount;512 CHAR8 *MessageBody;513 UINTN MessageBodyLength;514 UINTN ChunkLength;515 CHAR8 ChunkLengthStr[HTTP_IO_CHUNK_SIZE_STRING_LEN];516 EFI_HTTP_REQUEST_DATA *SentRequestData;513 EFI_STATUS Status; 514 EFI_HTTP_HEADER *NewHeaders; 515 EFI_HTTP_HEADER *ContentLengthHeader; 516 UINTN AddNewHeader; 517 UINTN HeaderCount; 518 CHAR8 *MessageBody; 519 UINTN MessageBodyLength; 520 UINTN ChunkLength; 521 CHAR8 ChunkLengthStr[HTTP_IO_CHUNK_SIZE_STRING_LEN]; 522 EFI_HTTP_REQUEST_DATA *SentRequestData; 517 523 518 524 AddNewHeader = 0; … … 523 529 524 530 switch (*SendChunkProcess) { 525 case HttpIoSendChunkHeaderZeroContent:531 case HttpIoSendChunkHeaderZeroContent: 526 532 ContentLengthHeader = HttpFindHeader (RequestMessage->HeaderCount, RequestMessage->Headers, HTTP_HEADER_CONTENT_LENGTH); 527 533 if (ContentLengthHeader == NULL) { … … 529 535 } 530 536 531 NewHeaders = AllocateZeroPool ((RequestMessage->HeaderCount + AddNewHeader) * sizeof (EFI_HTTP_HEADER));532 CopyMem ((VOID *)NewHeaders, (VOID *)RequestMessage->Headers, RequestMessage->HeaderCount * sizeof (EFI_HTTP_HEADER));537 NewHeaders = AllocateZeroPool ((RequestMessage->HeaderCount + AddNewHeader) * sizeof (EFI_HTTP_HEADER)); 538 CopyMem ((VOID *)NewHeaders, (VOID *)RequestMessage->Headers, RequestMessage->HeaderCount * sizeof (EFI_HTTP_HEADER)); 533 539 if (AddNewHeader == 0) { 534 540 // 535 541 // Override content-length to Transfer-Encoding. 536 542 // 537 ContentLengthHeader = HttpFindHeader (RequestMessage->HeaderCount, NewHeaders, HTTP_HEADER_CONTENT_LENGTH);538 ContentLengthHeader->FieldName = NULL;543 ContentLengthHeader = HttpFindHeader (RequestMessage->HeaderCount, NewHeaders, HTTP_HEADER_CONTENT_LENGTH); 544 ContentLengthHeader->FieldName = NULL; 539 545 ContentLengthHeader->FieldValue = NULL; 540 546 } else { 541 547 ContentLengthHeader = NewHeaders + RequestMessage->HeaderCount; 542 548 } 549 543 550 HttpSetFieldNameAndValue (ContentLengthHeader, HTTP_HEADER_TRANSFER_ENCODING, HTTP_HEADER_TRANSFER_ENCODING_CHUNKED); 544 HeaderCount = RequestMessage->HeaderCount + AddNewHeader;551 HeaderCount = RequestMessage->HeaderCount + AddNewHeader; 545 552 MessageBodyLength = 0; 546 MessageBody = NULL;547 SentRequestData = RequestMessage->Data.Request;553 MessageBody = NULL; 554 SentRequestData = RequestMessage->Data.Request; 548 555 break; 549 556 550 case HttpIoSendChunkContent:551 HeaderCount = 0;552 NewHeaders = NULL;557 case HttpIoSendChunkContent: 558 HeaderCount = 0; 559 NewHeaders = NULL; 553 560 SentRequestData = NULL; 554 561 if (RequestMessage->BodyLength > HTTP_IO_MAX_SEND_PAYLOAD) { … … 557 564 MessageBodyLength = RequestMessage->BodyLength; 558 565 } 566 559 567 AsciiSPrint ( 560 561 562 563 564 565 566 568 ChunkLengthStr, 569 HTTP_IO_CHUNK_SIZE_STRING_LEN, 570 "%x%c%c", 571 MessageBodyLength, 572 CHUNKED_TRANSFER_CODING_CR, 573 CHUNKED_TRANSFER_CODING_LF 574 ); 567 575 ChunkLength = AsciiStrLen (ChunkLengthStr); 568 576 MessageBody = AllocatePool (ChunkLength + MessageBodyLength + 2); 569 577 if (MessageBody == NULL) { 570 DEBUG ((DEBUG_ERROR, "Not enough memory for chunk transfer\n"));578 DEBUG ((DEBUG_ERROR, "Not enough memory for chunk transfer\n")); 571 579 return EFI_OUT_OF_RESOURCES; 572 580 } 581 573 582 // 574 583 // Build up the chunk transfer paylaod. … … 576 585 CopyMem (MessageBody, ChunkLengthStr, ChunkLength); 577 586 CopyMem (MessageBody + ChunkLength, RequestMessage->Body, MessageBodyLength); 578 *(MessageBody + ChunkLength + MessageBodyLength) = CHUNKED_TRANSFER_CODING_CR;587 *(MessageBody + ChunkLength + MessageBodyLength) = CHUNKED_TRANSFER_CODING_CR; 579 588 *(MessageBody + ChunkLength + MessageBodyLength + 1) = CHUNKED_TRANSFER_CODING_LF; 580 589 // … … 582 591 // 583 592 RequestMessage->BodyLength -= MessageBodyLength; 584 RequestMessage->Body = (VOID *)((CHAR8 *)RequestMessage->Body + MessageBodyLength);585 MessageBodyLength += (ChunkLength + 2);593 RequestMessage->Body = (VOID *)((CHAR8 *)RequestMessage->Body + MessageBodyLength); 594 MessageBodyLength += (ChunkLength + 2); 586 595 if (RequestMessage->BodyLength == 0) { 587 596 *SendChunkProcess = HttpIoSendChunkEndChunk; 588 597 } 598 589 599 break; 590 600 591 case HttpIoSendChunkEndChunk:592 HeaderCount = 0;593 NewHeaders = NULL;601 case HttpIoSendChunkEndChunk: 602 HeaderCount = 0; 603 NewHeaders = NULL; 594 604 SentRequestData = NULL; 595 605 AsciiSPrint ( … … 602 612 CHUNKED_TRANSFER_CODING_LF 603 613 ); 604 MessageBody = AllocatePool (AsciiStrLen (ChunkLengthStr));614 MessageBody = AllocatePool (AsciiStrLen (ChunkLengthStr)); 605 615 if (MessageBody == NULL) { 606 DEBUG ((DEBUG_ERROR, "Not enough memory for the end chunk transfer\n"));616 DEBUG ((DEBUG_ERROR, "Not enough memory for the end chunk transfer\n")); 607 617 return EFI_OUT_OF_RESOURCES; 608 618 } 619 609 620 CopyMem (MessageBody, ChunkLengthStr, AsciiStrLen (ChunkLengthStr)); 610 621 MessageBodyLength = AsciiStrLen (ChunkLengthStr); … … 612 623 break; 613 624 614 default:625 default: 615 626 return EFI_INVALID_PARAMETER; 616 627 } … … 628 639 FreePool (ContentLengthHeader->FieldName); 629 640 } 641 630 642 if (ContentLengthHeader->FieldValue != NULL) { 631 643 FreePool (ContentLengthHeader->FieldValue); 632 644 } 633 645 } 646 634 647 if (NewHeaders != NULL) { 635 648 FreePool (NewHeaders); 636 649 } 650 637 651 if (MessageBody != NULL) { 638 652 FreePool (MessageBody); 639 653 } 654 640 655 return Status; 641 656 } … … 662 677 EFI_STATUS 663 678 HttpIoGetChunkedTransferContent ( 664 IN HTTP_IO 665 IN UINTN 666 IN EFI_HTTP_HEADER 667 OUT LIST_ENTRY 668 OUT UINTN 679 IN HTTP_IO *HttpIo, 680 IN UINTN HeaderCount, 681 IN EFI_HTTP_HEADER *Headers, 682 OUT LIST_ENTRY **ChunkListHead, 683 OUT UINTN *ContentLength 669 684 ) 670 685 { 671 EFI_HTTP_HEADER *Header;672 CHAR8 ChunkSizeAscii[256];673 EFI_STATUS Status;674 UINTN Index;675 HTTP_IO_RESPONSE_DATA ResponseData;676 UINTN TotalLength;677 UINTN MaxTotalLength;678 LIST_ENTRY *HttpChunks;679 HTTP_IO_CHUNKS *ThisChunk;680 LIST_ENTRY *ThisListEntry;681 682 if ( ChunkListHead == NULL || ContentLength == NULL) {686 EFI_HTTP_HEADER *Header; 687 CHAR8 ChunkSizeAscii[256]; 688 EFI_STATUS Status; 689 UINTN Index; 690 HTTP_IO_RESPONSE_DATA ResponseData; 691 UINTN TotalLength; 692 UINTN MaxTotalLength; 693 LIST_ENTRY *HttpChunks; 694 HTTP_IO_CHUNKS *ThisChunk; 695 LIST_ENTRY *ThisListEntry; 696 697 if ((ChunkListHead == NULL) || (ContentLength == NULL)) { 683 698 return EFI_INVALID_PARAMETER; 684 699 } 685 700 686 701 *ContentLength = 0; 687 Header = HttpFindHeader (HeaderCount, Headers, HTTP_HEADER_TRANSFER_ENCODING);702 Header = HttpFindHeader (HeaderCount, Headers, HTTP_HEADER_TRANSFER_ENCODING); 688 703 if (Header == NULL) { 689 704 return EFI_NOT_FOUND; … … 693 708 return EFI_NOT_FOUND; 694 709 } 710 695 711 // 696 712 // Loop to get all chunks. 697 713 // 698 TotalLength = 0;714 TotalLength = 0; 699 715 MaxTotalLength = PcdGet32 (PcdMaxHttpChunkTransfer); 700 HttpChunks = (LIST_ENTRY *)AllocateZeroPool (sizeof (LIST_ENTRY));716 HttpChunks = (LIST_ENTRY *)AllocateZeroPool (sizeof (LIST_ENTRY)); 701 717 if (HttpChunks == NULL) { 702 718 Status = EFI_OUT_OF_RESOURCES; 703 719 goto ExitDeleteChunks; 704 720 } 721 705 722 InitializeListHead (HttpChunks); 706 723 DEBUG ((DEBUG_INFO, " Chunked transfer\n")); 707 724 while (TRUE) { 708 ZeroMem ((VOID *)&ResponseData, sizeof(HTTP_IO_RESPONSE_DATA));725 ZeroMem ((VOID *)&ResponseData, sizeof (HTTP_IO_RESPONSE_DATA)); 709 726 ResponseData.BodyLength = HTTP_IO_CHUNKED_TRANSFER_CODING_DATA_LENGTH; 710 ResponseData.Body = ChunkSizeAscii;711 Status = HttpIoRecvResponse (712 HttpIo,713 FALSE,714 &ResponseData715 );727 ResponseData.Body = ChunkSizeAscii; 728 Status = HttpIoRecvResponse ( 729 HttpIo, 730 FALSE, 731 &ResponseData 732 ); 716 733 if (EFI_ERROR (Status)) { 717 734 goto ExitDeleteChunks; 718 735 } 736 719 737 // 720 738 // Decoding Chunked Transfer Coding. … … 725 743 // Break if this is last chunk. 726 744 // 727 if (ChunkSizeAscii 745 if (ChunkSizeAscii[0] == CHUNKED_TRANSFER_CODING_LAST_CHUNK) { 728 746 // 729 747 // Check if this is a valid Last-Chunk. 730 748 // 731 if ((ChunkSizeAscii [1] != CHUNKED_TRANSFER_CODING_CR) || 732 (ChunkSizeAscii [2] != CHUNKED_TRANSFER_CODING_LF) 733 ) { 749 if ((ChunkSizeAscii[1] != CHUNKED_TRANSFER_CODING_CR) || 750 (ChunkSizeAscii[2] != CHUNKED_TRANSFER_CODING_LF) 751 ) 752 { 734 753 DEBUG ((DEBUG_ERROR, " This is an invalid Last-chunk\n")); 735 754 Status = EFI_INVALID_PARAMETER; … … 747 766 InitializeListHead (&ThisChunk->NextChunk); 748 767 ThisChunk->Length = ResponseData.BodyLength - 1 - 2; // Minus sizeof '0' and CRLF. 749 ThisChunk->Data = (CHAR8 *)AllocatePool (ThisChunk->Length);768 ThisChunk->Data = (CHAR8 *)AllocatePool (ThisChunk->Length); 750 769 if (ThisChunk->Data == NULL) { 751 770 FreePool ((UINT8 *)ThisChunk); … … 753 772 goto ExitDeleteChunks; 754 773 } 774 755 775 CopyMem ((UINT8 *)ThisChunk->Data, (UINT8 *)ResponseData.Body + 1, ThisChunk->Length); 756 776 TotalLength += ThisChunk->Length; … … 763 783 // 764 784 Index = 0; 765 while ((ChunkSizeAscii [Index] != CHUNKED_TRANSFER_CODING_EXTENSION_SEPARATOR) && 766 (ChunkSizeAscii [Index] != (CHAR8)CHUNKED_TRANSFER_CODING_CR) && 767 (Index != HTTP_IO_CHUNKED_TRANSFER_CODING_DATA_LENGTH)) { 768 Index ++; 785 while ((ChunkSizeAscii[Index] != CHUNKED_TRANSFER_CODING_EXTENSION_SEPARATOR) && 786 (ChunkSizeAscii[Index] != (CHAR8)CHUNKED_TRANSFER_CODING_CR) && 787 (Index != HTTP_IO_CHUNKED_TRANSFER_CODING_DATA_LENGTH)) 788 { 789 Index++; 769 790 } 770 791 … … 773 794 goto ExitDeleteChunks; 774 795 } 796 775 797 ChunkSizeAscii[Index] = 0; 776 798 AsciiStrHexToUintnS (ChunkSizeAscii, NULL, ContentLength); … … 784 806 goto ExitDeleteChunks; 785 807 } 808 786 809 ResponseData.BodyLength = *ContentLength; 787 ResponseData.Body = (CHAR8 *)AllocatePool (*ContentLength);810 ResponseData.Body = (CHAR8 *)AllocatePool (*ContentLength); 788 811 if (ResponseData.Body == NULL) { 789 812 FreePool (ThisChunk); … … 791 814 goto ExitDeleteChunks; 792 815 } 816 793 817 InitializeListHead (&ThisChunk->NextChunk); 794 818 ThisChunk->Length = *ContentLength; 795 ThisChunk->Data = ResponseData.Body;819 ThisChunk->Data = ResponseData.Body; 796 820 InsertTailList (HttpChunks, &ThisChunk->NextChunk); 797 821 Status = HttpIoRecvResponse ( … … 803 827 goto ExitDeleteChunks; 804 828 } 829 805 830 // 806 831 // Read CRLF 807 832 // 808 ZeroMem ((VOID *)&ResponseData, sizeof(HTTP_IO_RESPONSE_DATA));833 ZeroMem ((VOID *)&ResponseData, sizeof (HTTP_IO_RESPONSE_DATA)); 809 834 ResponseData.BodyLength = 2; 810 ResponseData.Body = ChunkSizeAscii;811 Status = HttpIoRecvResponse (812 HttpIo,813 FALSE,814 &ResponseData815 );835 ResponseData.Body = ChunkSizeAscii; 836 Status = HttpIoRecvResponse ( 837 HttpIo, 838 FALSE, 839 &ResponseData 840 ); 816 841 if (EFI_ERROR (Status)) { 817 842 goto ExitDeleteChunks; 818 843 } 844 819 845 // 820 846 // Verify the end of chunk payload. 821 847 // 822 if ((ChunkSizeAscii [0] != CHUNKED_TRANSFER_CODING_CR) || 823 (ChunkSizeAscii [1] != CHUNKED_TRANSFER_CODING_LF) 824 ) { 825 DEBUG ((DEBUG_ERROR, " This is an invalid End-of-chunk notation.\n")); 826 goto ExitDeleteChunks; 827 } 848 if ((ChunkSizeAscii[0] != CHUNKED_TRANSFER_CODING_CR) || 849 (ChunkSizeAscii[1] != CHUNKED_TRANSFER_CODING_LF) 850 ) 851 { 852 DEBUG ((DEBUG_ERROR, " This is an invalid End-of-chunk notation.\n")); 853 goto ExitDeleteChunks; 854 } 855 828 856 TotalLength += *ContentLength; 829 857 if (TotalLength > MaxTotalLength) { 830 831 858 DEBUG ((DEBUG_ERROR, " Total chunk transfer payload exceeds the size defined by PcdMaxHttpChunkTransfer.\n")); 859 goto ExitDeleteChunks; 832 860 } 833 861 } … … 840 868 ExitDeleteChunks: 841 869 if (HttpChunks != NULL) { 842 while (!IsListEmpty (HttpChunks)) {870 while (!IsListEmpty (HttpChunks)) { 843 871 ThisListEntry = GetFirstNode (HttpChunks); 844 872 RemoveEntryList (ThisListEntry); … … 847 875 FreePool (ThisChunk->Data); 848 876 } 849 FreePool(ThisListEntry); 850 } 877 878 FreePool (ThisListEntry); 879 } 880 851 881 FreePool (HttpChunks); 852 882 } 883 853 884 return Status; 854 885 }
Note:
See TracChangeset
for help on using the changeset viewer.