Re: [edk2] [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly.
The patch looks good to me. Reviewed-by: Wu Jiaxin-Original Message- From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Zhang Lubo Sent: Friday, November 6, 2015 4:12 PM To: edk2-devel@lists.01.org Cc: Ye, Ting; Fu, Siyuan; Wu, Jiaxin; Gary Ching-Pang Lin Subject: [edk2] [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly. v2: *Add a Url Parse state machine to indicate the host is ipv6 expressed url and can parse the ipv6 address correctly. Cc: Fu Siyuan Cc: Ye Ting CC: Wu Jiaxin CC: Gary Ching-Pang Lin Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Zhang Lubo --- MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 33 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c index aeb52d0..500b3c7 100644 --- a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c +++ b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c @@ -68,10 +68,11 @@ typedef enum { UrlParserFragmentStart, // "#" UrlParserFragment, UrlParserUserInfo, UrlParserHostStart, // "@" UrlParserHost, + UrlParserHostIpv6, // "["(Ipv6 address) "]" UrlParserPortStart, // ":" UrlParserPort, UrlParserStateMax } HTTP_URL_PARSE_STATE; @@ -136,17 +137,20 @@ UriPercentDecode ( This function return the updated state accroding to the input state and next character of the authority. @param[in] Char Next character. @param[in] State Current value of the parser state machine. + @param[in] IsRightBracket TRUE if there is an sign ']' in the authority component and + indicates the next part is ':' before Port. @return Updated state value. **/ HTTP_URL_PARSE_STATE NetHttpParseAuthorityChar ( IN CHAR8 Char, - IN HTTP_URL_PARSE_STATE State + IN HTTP_URL_PARSE_STATE State, + IN BOOLEAN*IsRightBracket ) { // // RFC 3986: @@ -167,16 +171,31 @@ NetHttpParseAuthorityChar ( return UrlParserHostStart; } break; case UrlParserHost: - case UrlParserHostStart: + case UrlParserHostStart: +if (Char == '[') { + return UrlParserHostIpv6; +} + if (Char == ':') { return UrlParserPortStart; } + return UrlParserHost; - + + case UrlParserHostIpv6: +if (Char == ']') { + *IsRightBracket = TRUE; +} + +if (Char == ':' && *IsRightBracket == TRUE) { + return UrlParserPortStart; +} +return UrlParserHostIpv6; + case UrlParserPort: case UrlParserPortStart: return UrlParserPort; default: @@ -208,10 +227,11 @@ NetHttpParseAuthority ( CHAR8 *Authority; UINT32Length; HTTP_URL_PARSE_STATE State; UINT32Field; UINT32OldField; + BOOLEAN IsrightBracket; ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0); // // authority = [ userinfo "@" ] host [ ":" port ] @@ -220,16 +240,17 @@ NetHttpParseAuthority ( State = UrlParserUserInfo; } else { State = UrlParserHost; } + IsrightBracket = FALSE; Field = HTTP_URI_FIELD_MAX; OldField = Field; Authority = Url + UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Offset; Length = UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Length; for (Char = Authority; Char < Authority + Length; Char++) { -State = NetHttpParseAuthorityChar (*Char, State); +State = NetHttpParseAuthorityChar (*Char, State, ); switch (State) { case UrlParserStateMax: return EFI_INVALID_PARAMETER; case UrlParserHostStart: @@ -241,10 +262,14 @@ NetHttpParseAuthority ( break; case UrlParserHost: Field = HTTP_URI_FIELD_HOST; break; + +case UrlParserHostIpv6: + Field = HTTP_URI_FIELD_HOST; + break; case UrlParserPort: Field = HTTP_URI_FIELD_PORT; break; -- 1.9.5.msysgit.1 ___ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel ___ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
[edk2] [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly.
v2: *Add a Url Parse state machine to indicate the host is ipv6 expressed url and can parse the ipv6 address correctly. Cc: Fu SiyuanCc: Ye Ting CC: Wu Jiaxin CC: Gary Ching-Pang Lin Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Zhang Lubo --- MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 33 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c index aeb52d0..500b3c7 100644 --- a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c +++ b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c @@ -68,10 +68,11 @@ typedef enum { UrlParserFragmentStart, // "#" UrlParserFragment, UrlParserUserInfo, UrlParserHostStart, // "@" UrlParserHost, + UrlParserHostIpv6, // "["(Ipv6 address) "]" UrlParserPortStart, // ":" UrlParserPort, UrlParserStateMax } HTTP_URL_PARSE_STATE; @@ -136,17 +137,20 @@ UriPercentDecode ( This function return the updated state accroding to the input state and next character of the authority. @param[in] Char Next character. @param[in] State Current value of the parser state machine. + @param[in] IsRightBracket TRUE if there is an sign ']' in the authority component and + indicates the next part is ':' before Port. @return Updated state value. **/ HTTP_URL_PARSE_STATE NetHttpParseAuthorityChar ( IN CHAR8 Char, - IN HTTP_URL_PARSE_STATE State + IN HTTP_URL_PARSE_STATE State, + IN BOOLEAN*IsRightBracket ) { // // RFC 3986: @@ -167,16 +171,31 @@ NetHttpParseAuthorityChar ( return UrlParserHostStart; } break; case UrlParserHost: - case UrlParserHostStart: + case UrlParserHostStart: +if (Char == '[') { + return UrlParserHostIpv6; +} + if (Char == ':') { return UrlParserPortStart; } + return UrlParserHost; - + + case UrlParserHostIpv6: +if (Char == ']') { + *IsRightBracket = TRUE; +} + +if (Char == ':' && *IsRightBracket == TRUE) { + return UrlParserPortStart; +} +return UrlParserHostIpv6; + case UrlParserPort: case UrlParserPortStart: return UrlParserPort; default: @@ -208,10 +227,11 @@ NetHttpParseAuthority ( CHAR8 *Authority; UINT32Length; HTTP_URL_PARSE_STATE State; UINT32Field; UINT32OldField; + BOOLEAN IsrightBracket; ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0); // // authority = [ userinfo "@" ] host [ ":" port ] @@ -220,16 +240,17 @@ NetHttpParseAuthority ( State = UrlParserUserInfo; } else { State = UrlParserHost; } + IsrightBracket = FALSE; Field = HTTP_URI_FIELD_MAX; OldField = Field; Authority = Url + UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Offset; Length = UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Length; for (Char = Authority; Char < Authority + Length; Char++) { -State = NetHttpParseAuthorityChar (*Char, State); +State = NetHttpParseAuthorityChar (*Char, State, ); switch (State) { case UrlParserStateMax: return EFI_INVALID_PARAMETER; case UrlParserHostStart: @@ -241,10 +262,14 @@ NetHttpParseAuthority ( break; case UrlParserHost: Field = HTTP_URI_FIELD_HOST; break; + +case UrlParserHostIpv6: + Field = HTTP_URI_FIELD_HOST; + break; case UrlParserPort: Field = HTTP_URI_FIELD_PORT; break; -- 1.9.5.msysgit.1 ___ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly.
On Fri, Nov 06, 2015 at 04:11:45PM +0800, Zhang Lubo wrote: > v2: > *Add a Url Parse state machine to indicate the host is ipv6 expressed url and > can parse > the ipv6 address correctly. > This patch works for me. The IPv6 address was extracted from my url. Tested-by: Gary Ching-Pang Lin> Cc: Fu Siyuan > Cc: Ye Ting > CC: Wu Jiaxin > CC: Gary Ching-Pang Lin > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Zhang Lubo > --- > MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 33 > > 1 file changed, 29 insertions(+), 4 deletions(-) > > diff --git a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c > b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c > index aeb52d0..500b3c7 100644 > --- a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c > +++ b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c > @@ -68,10 +68,11 @@ typedef enum { >UrlParserFragmentStart, // "#" >UrlParserFragment, >UrlParserUserInfo, >UrlParserHostStart, // "@" >UrlParserHost, > + UrlParserHostIpv6, // "["(Ipv6 address) "]" >UrlParserPortStart, // ":" >UrlParserPort, >UrlParserStateMax > } HTTP_URL_PARSE_STATE; > > @@ -136,17 +137,20 @@ UriPercentDecode ( >This function return the updated state accroding to the input state and > next character of >the authority. > >@param[in] Char Next character. >@param[in] State Current value of the parser state machine. > + @param[in] IsRightBracket TRUE if there is an sign ']' in the > authority component and > + indicates the next part is ':' before > Port. > >@return Updated state value. > **/ > HTTP_URL_PARSE_STATE > NetHttpParseAuthorityChar ( >IN CHAR8 Char, > - IN HTTP_URL_PARSE_STATE State > + IN HTTP_URL_PARSE_STATE State, > + IN BOOLEAN*IsRightBracket >) > { > >// >// RFC 3986: > @@ -167,16 +171,31 @@ NetHttpParseAuthorityChar ( >return UrlParserHostStart; > } > break; > >case UrlParserHost: > - case UrlParserHostStart: > + case UrlParserHostStart: > +if (Char == '[') { > + return UrlParserHostIpv6; > +} > + > if (Char == ':') { >return UrlParserPortStart; > } > + > return UrlParserHost; > - > + > + case UrlParserHostIpv6: > +if (Char == ']') { > + *IsRightBracket = TRUE; > +} > + > +if (Char == ':' && *IsRightBracket == TRUE) { > + return UrlParserPortStart; > +} > +return UrlParserHostIpv6; > + >case UrlParserPort: >case UrlParserPortStart: > return UrlParserPort; > >default: > @@ -208,10 +227,11 @@ NetHttpParseAuthority ( >CHAR8 *Authority; >UINT32Length; >HTTP_URL_PARSE_STATE State; >UINT32Field; >UINT32OldField; > + BOOLEAN IsrightBracket; > >ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0); > >// >// authority = [ userinfo "@" ] host [ ":" port ] > @@ -220,16 +240,17 @@ NetHttpParseAuthority ( > State = UrlParserUserInfo; >} else { > State = UrlParserHost; >} > > + IsrightBracket = FALSE; >Field = HTTP_URI_FIELD_MAX; >OldField = Field; >Authority = Url + UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Offset; >Length = UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Length; >for (Char = Authority; Char < Authority + Length; Char++) { > -State = NetHttpParseAuthorityChar (*Char, State); > +State = NetHttpParseAuthorityChar (*Char, State, ); > switch (State) { > case UrlParserStateMax: >return EFI_INVALID_PARAMETER; > > case UrlParserHostStart: > @@ -241,10 +262,14 @@ NetHttpParseAuthority ( >break; > > case UrlParserHost: >Field = HTTP_URI_FIELD_HOST; >break; > + > +case UrlParserHostIpv6: > + Field = HTTP_URI_FIELD_HOST; > + break; > > case UrlParserPort: >Field = HTTP_URI_FIELD_PORT; >break; > > -- > 1.9.5.msysgit.1 > > ___ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel > ___ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly.
Yes , you are right, I will make some changes. Thanks -Original Message- From: Fu, Siyuan Sent: Friday, November 06, 2015 10:02 AM To: Zhang, Lubo; edk2-devel@lists.01.org Cc: Ye, Ting; Wu, Jiaxin; Gary Ching-Pang Lin Subject: RE: [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly. Hi, Lubo The patch pass "IsBracket" by value so it will always be FALSE, please check it. Siyuan -Original Message- From: Zhang, Lubo Sent: Friday, November 6, 2015 9:31 AM To: edk2-devel@lists.01.org Cc: Fu, Siyuan; Ye, Ting ; Wu, Jiaxin ; Gary Ching-Pang Lin Subject: [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly. When parsing the authority component of the input URL, it can not distinguish the ":" is the flag that indicates the port or the separator between the ipv6 address. Cc: Fu Siyuan Cc: Ye Ting CC: Wu Jiaxin CC: Gary Ching-Pang Lin Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Zhang Lubo --- MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 25 +++-- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c index aeb52d0..8c3e4fe 100644 --- a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c +++ b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c @@ -136,17 +136,20 @@ UriPercentDecode ( This function return the updated state accroding to the input state and next character of the authority. @param[in] Char Next character. @param[in] State Current value of the parser state machine. + @param[in] IsBracket TRUE if there is an sign '[' in the authority component and + indicates the next part is Ipv6 address. @return Updated state value. **/ HTTP_URL_PARSE_STATE NetHttpParseAuthorityChar ( IN CHAR8 Char, - IN HTTP_URL_PARSE_STATE State + IN HTTP_URL_PARSE_STATE State, + IN BOOLEANIsBracket ) { // // RFC 3986: @@ -167,18 +170,26 @@ NetHttpParseAuthorityChar ( return UrlParserHostStart; } break; case UrlParserHost: - case UrlParserHostStart: -if (Char == ':') { + case UrlParserHostStart: +if (Char == '[') { + IsBracket = TRUE; +} + +if (Char == ']' || (IsBracket == FALSE && Char == ':')) { return UrlParserPortStart; } + return UrlParserHost; case UrlParserPort: case UrlParserPortStart: +if (Char == ':') { + return UrlParserPortStart; +} return UrlParserPort; default: break; } @@ -208,10 +219,11 @@ NetHttpParseAuthority ( CHAR8 *Authority; UINT32Length; HTTP_URL_PARSE_STATE State; UINT32Field; UINT32OldField; + BOOLEAN IsBracket; ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0); // // authority = [ userinfo "@" ] host [ ":" port ] @@ -220,16 +232,17 @@ NetHttpParseAuthority ( State = UrlParserUserInfo; } else { State = UrlParserHost; } + IsBracket = FALSE; Field = HTTP_URI_FIELD_MAX; OldField = Field; Authority = Url + UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Offset; Length = UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Length; for (Char = Authority; Char < Authority + Length; Char++) { -State = NetHttpParseAuthorityChar (*Char, State); +State = NetHttpParseAuthorityChar (*Char, State, IsBracket); switch (State) { case UrlParserStateMax: return EFI_INVALID_PARAMETER; case UrlParserHostStart: @@ -672,22 +685,22 @@ HttpUrlGetIp6 ( if (Length < 2) { return EFI_INVALID_PARAMETER; } Ptr= Url + Parser->FieldData[HTTP_URI_FIELD_HOST].Offset; - if ((Ptr[0] != '[') || (Ptr[Length - 1] != ']')) { + if ((Ptr[0] != '[') || (Ptr[Length] != ']')) { return EFI_INVALID_PARAMETER; } Ip6String = AllocatePool (Length); if (Ip6String == NULL) { return EFI_OUT_OF_RESOURCES; } Status = UriPercentDecode ( Ptr + 1, - Length - 2, + Length - 1, Ip6String, ); if (EFI_ERROR (Status)) { return Status; -- 1.9.5.msysgit.1 ___ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
[edk2] [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly.
When parsing the authority component of the input URL, it can not distinguish the ":" is the flag that indicates the port or the separator between the ipv6 address. Cc: Fu SiyuanCc: Ye Ting CC: Wu Jiaxin CC: Gary Ching-Pang Lin Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Zhang Lubo --- MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 25 +++-- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c index aeb52d0..8c3e4fe 100644 --- a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c +++ b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c @@ -136,17 +136,20 @@ UriPercentDecode ( This function return the updated state accroding to the input state and next character of the authority. @param[in] Char Next character. @param[in] State Current value of the parser state machine. + @param[in] IsBracket TRUE if there is an sign '[' in the authority component and + indicates the next part is Ipv6 address. @return Updated state value. **/ HTTP_URL_PARSE_STATE NetHttpParseAuthorityChar ( IN CHAR8 Char, - IN HTTP_URL_PARSE_STATE State + IN HTTP_URL_PARSE_STATE State, + IN BOOLEANIsBracket ) { // // RFC 3986: @@ -167,18 +170,26 @@ NetHttpParseAuthorityChar ( return UrlParserHostStart; } break; case UrlParserHost: - case UrlParserHostStart: -if (Char == ':') { + case UrlParserHostStart: +if (Char == '[') { + IsBracket = TRUE; +} + +if (Char == ']' || (IsBracket == FALSE && Char == ':')) { return UrlParserPortStart; } + return UrlParserHost; case UrlParserPort: case UrlParserPortStart: +if (Char == ':') { + return UrlParserPortStart; +} return UrlParserPort; default: break; } @@ -208,10 +219,11 @@ NetHttpParseAuthority ( CHAR8 *Authority; UINT32Length; HTTP_URL_PARSE_STATE State; UINT32Field; UINT32OldField; + BOOLEAN IsBracket; ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0); // // authority = [ userinfo "@" ] host [ ":" port ] @@ -220,16 +232,17 @@ NetHttpParseAuthority ( State = UrlParserUserInfo; } else { State = UrlParserHost; } + IsBracket = FALSE; Field = HTTP_URI_FIELD_MAX; OldField = Field; Authority = Url + UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Offset; Length = UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Length; for (Char = Authority; Char < Authority + Length; Char++) { -State = NetHttpParseAuthorityChar (*Char, State); +State = NetHttpParseAuthorityChar (*Char, State, IsBracket); switch (State) { case UrlParserStateMax: return EFI_INVALID_PARAMETER; case UrlParserHostStart: @@ -672,22 +685,22 @@ HttpUrlGetIp6 ( if (Length < 2) { return EFI_INVALID_PARAMETER; } Ptr= Url + Parser->FieldData[HTTP_URI_FIELD_HOST].Offset; - if ((Ptr[0] != '[') || (Ptr[Length - 1] != ']')) { + if ((Ptr[0] != '[') || (Ptr[Length] != ']')) { return EFI_INVALID_PARAMETER; } Ip6String = AllocatePool (Length); if (Ip6String == NULL) { return EFI_OUT_OF_RESOURCES; } Status = UriPercentDecode ( Ptr + 1, - Length - 2, + Length - 1, Ip6String, ); if (EFI_ERROR (Status)) { return Status; -- 1.9.5.msysgit.1 ___ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly.
Hi, Lubo The patch pass "IsBracket" by value so it will always be FALSE, please check it. Siyuan -Original Message- From: Zhang, Lubo Sent: Friday, November 6, 2015 9:31 AM To: edk2-devel@lists.01.org Cc: Fu, Siyuan; Ye, Ting ; Wu, Jiaxin ; Gary Ching-Pang Lin Subject: [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly. When parsing the authority component of the input URL, it can not distinguish the ":" is the flag that indicates the port or the separator between the ipv6 address. Cc: Fu Siyuan Cc: Ye Ting CC: Wu Jiaxin CC: Gary Ching-Pang Lin Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Zhang Lubo --- MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 25 +++-- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c index aeb52d0..8c3e4fe 100644 --- a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c +++ b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c @@ -136,17 +136,20 @@ UriPercentDecode ( This function return the updated state accroding to the input state and next character of the authority. @param[in] Char Next character. @param[in] State Current value of the parser state machine. + @param[in] IsBracket TRUE if there is an sign '[' in the authority component and + indicates the next part is Ipv6 address. @return Updated state value. **/ HTTP_URL_PARSE_STATE NetHttpParseAuthorityChar ( IN CHAR8 Char, - IN HTTP_URL_PARSE_STATE State + IN HTTP_URL_PARSE_STATE State, + IN BOOLEANIsBracket ) { // // RFC 3986: @@ -167,18 +170,26 @@ NetHttpParseAuthorityChar ( return UrlParserHostStart; } break; case UrlParserHost: - case UrlParserHostStart: -if (Char == ':') { + case UrlParserHostStart: +if (Char == '[') { + IsBracket = TRUE; +} + +if (Char == ']' || (IsBracket == FALSE && Char == ':')) { return UrlParserPortStart; } + return UrlParserHost; case UrlParserPort: case UrlParserPortStart: +if (Char == ':') { + return UrlParserPortStart; +} return UrlParserPort; default: break; } @@ -208,10 +219,11 @@ NetHttpParseAuthority ( CHAR8 *Authority; UINT32Length; HTTP_URL_PARSE_STATE State; UINT32Field; UINT32OldField; + BOOLEAN IsBracket; ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0); // // authority = [ userinfo "@" ] host [ ":" port ] @@ -220,16 +232,17 @@ NetHttpParseAuthority ( State = UrlParserUserInfo; } else { State = UrlParserHost; } + IsBracket = FALSE; Field = HTTP_URI_FIELD_MAX; OldField = Field; Authority = Url + UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Offset; Length = UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Length; for (Char = Authority; Char < Authority + Length; Char++) { -State = NetHttpParseAuthorityChar (*Char, State); +State = NetHttpParseAuthorityChar (*Char, State, IsBracket); switch (State) { case UrlParserStateMax: return EFI_INVALID_PARAMETER; case UrlParserHostStart: @@ -672,22 +685,22 @@ HttpUrlGetIp6 ( if (Length < 2) { return EFI_INVALID_PARAMETER; } Ptr= Url + Parser->FieldData[HTTP_URI_FIELD_HOST].Offset; - if ((Ptr[0] != '[') || (Ptr[Length - 1] != ']')) { + if ((Ptr[0] != '[') || (Ptr[Length] != ']')) { return EFI_INVALID_PARAMETER; } Ip6String = AllocatePool (Length); if (Ip6String == NULL) { return EFI_OUT_OF_RESOURCES; } Status = UriPercentDecode ( Ptr + 1, - Length - 2, + Length - 1, Ip6String, ); if (EFI_ERROR (Status)) { return Status; -- 1.9.5.msysgit.1 ___ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel