@@ -84,6 +84,11 @@ function matchUrlSegment(str: string): string {
8484 var match = RegExpWrapper . firstMatch ( SEGMENT_RE , str ) ;
8585 return isPresent ( match ) ? match [ 0 ] : '' ;
8686}
87+ var QUERY_PARAM_VALUE_RE = RegExpWrapper . create ( '^[^\\(\\)\\?;&#]+' ) ;
88+ function matchUrlQueryParamValue ( str : string ) : string {
89+ var match = RegExpWrapper . firstMatch ( QUERY_PARAM_VALUE_RE , str ) ;
90+ return isPresent ( match ) ? match [ 0 ] : '' ;
91+ }
8792
8893export class UrlParser {
8994 private _remaining : string ;
@@ -163,10 +168,10 @@ export class UrlParser {
163168 parseQueryParams ( ) : { [ key : string ] : any } {
164169 var params : { [ key : string ] : any } = { } ;
165170 this . capture ( '?' ) ;
166- this . parseParam ( params ) ;
171+ this . parseQueryParam ( params ) ;
167172 while ( this . _remaining . length > 0 && this . peekStartsWith ( '&' ) ) {
168173 this . capture ( '&' ) ;
169- this . parseParam ( params ) ;
174+ this . parseQueryParam ( params ) ;
170175 }
171176 return params ;
172177 }
@@ -199,6 +204,25 @@ export class UrlParser {
199204 params [ key ] = value ;
200205 }
201206
207+ parseQueryParam ( params : { [ key : string ] : any } ) : void {
208+ var key = matchUrlSegment ( this . _remaining ) ;
209+ if ( isBlank ( key ) ) {
210+ return ;
211+ }
212+ this . capture ( key ) ;
213+ var value : any = true ;
214+ if ( this . peekStartsWith ( '=' ) ) {
215+ this . capture ( '=' ) ;
216+ var valueMatch = matchUrlQueryParamValue ( this . _remaining ) ;
217+ if ( isPresent ( valueMatch ) ) {
218+ value = valueMatch ;
219+ this . capture ( value ) ;
220+ }
221+ }
222+
223+ params [ key ] = value ;
224+ }
225+
202226 parseAuxiliaryRoutes ( ) : Url [ ] {
203227 var routes : Url [ ] = [ ] ;
204228 this . capture ( '(' ) ;
0 commit comments