X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=NetworkPkg%2FHttpBootDxe%2FHttpBootSupport.c;h=d508e2c1a979f85df8ace5f4a5c2940bdfb2c921;hb=2913ebb2b550f50a14f105e26995dd095e627ba4;hp=8fe81eb8d964dc21d141ba67400046d41aaa0f2d;hpb=406d1d92a8d8daa50d65296096db725e6f164432;p=mirror_edk2.git diff --git a/NetworkPkg/HttpBootDxe/HttpBootSupport.c b/NetworkPkg/HttpBootDxe/HttpBootSupport.c index 8fe81eb8d9..d508e2c1a9 100644 --- a/NetworkPkg/HttpBootDxe/HttpBootSupport.c +++ b/NetworkPkg/HttpBootDxe/HttpBootSupport.c @@ -160,7 +160,7 @@ HttpBootPrintErrorMessage ( AsciiPrint ("\n"); switch (StatusCode) { - case HTTP_STATUS_300_MULTIPLE_CHIOCES: + case HTTP_STATUS_300_MULTIPLE_CHOICES: AsciiPrint ("\n Redirection: 300 Multiple Choices"); break; @@ -671,6 +671,9 @@ HttpIoNotify ( @param[in] Controller The handle of the controller. @param[in] IpVersion IP_VERSION_4 or IP_VERSION_6. @param[in] ConfigData The HTTP_IO configuration data. + @param[in] Callback Callback function which will be invoked when specified + HTTP_IO_CALLBACK_EVENT happened. + @param[in] Context The Context data which will be passed to the Callback function. @param[out] HttpIo The HTTP_IO. @retval EFI_SUCCESS The HTTP_IO is created and configured. @@ -687,6 +690,8 @@ HttpIoCreateIo ( IN EFI_HANDLE Controller, IN UINT8 IpVersion, IN HTTP_IO_CONFIG_DATA *ConfigData, + IN HTTP_IO_CALLBACK Callback, + IN VOID *Context, OUT HTTP_IO *HttpIo ) { @@ -739,6 +744,8 @@ HttpIoCreateIo ( HttpIo->Controller = Controller; HttpIo->IpVersion = IpVersion; HttpIo->Http = Http; + HttpIo->Callback = Callback; + HttpIo->Context = Context; ZeroMem (&HttpConfigData, sizeof (EFI_HTTP_CONFIG_DATA)); HttpConfigData.HttpVersion = HttpVersion11; @@ -908,6 +915,17 @@ HttpIoSendRequest ( HttpIo->ReqToken.Message->BodyLength = BodyLength; HttpIo->ReqToken.Message->Body = Body; + if (HttpIo->Callback != NULL) { + Status = HttpIo->Callback ( + HttpIoRequest, + HttpIo->ReqToken.Message, + HttpIo->Context + ); + if (EFI_ERROR (Status)) { + return Status; + } + } + // // Queue the request token to HTTP instances. // @@ -1016,6 +1034,18 @@ HttpIoRecvResponse ( HttpIo->IsRxDone = FALSE; } + if ((HttpIo->Callback != NULL) && + (HttpIo->RspToken.Status == EFI_SUCCESS || HttpIo->RspToken.Status == EFI_HTTP_ERROR)) { + Status = HttpIo->Callback ( + HttpIoResponse, + HttpIo->RspToken.Message, + HttpIo->Context + ); + if (EFI_ERROR (Status)) { + return Status; + } + } + // // Store the received data into the wrapper. // @@ -1290,3 +1320,25 @@ HttpBootRegisterRamDisk ( return Status; } +/** + Indicate if the HTTP status code indicates a redirection. + + @param[in] StatusCode HTTP status code from server. + + @return TRUE if it's redirection. + +**/ +BOOLEAN +HttpBootIsHttpRedirectStatusCode ( + IN EFI_HTTP_STATUS_CODE StatusCode + ) +{ + if (StatusCode == HTTP_STATUS_301_MOVED_PERMANENTLY || + StatusCode == HTTP_STATUS_302_FOUND || + StatusCode == HTTP_STATUS_307_TEMPORARY_REDIRECT || + StatusCode == HTTP_STATUS_308_PERMANENT_REDIRECT) { + return TRUE; + } + + return FALSE; +}