Skip to content
Snippets Groups Projects
  • George Joseph's avatar
    8da4e28a
    res_ari.c: Prefer exact handler match over wildcard · 8da4e28a
    George Joseph authored
    Given the following request path and 2 handler paths...
    Request: /channels/externalMedia
    Handler: /channels/{channelId}      "wildcard"
    Handler: /channels/externalmedia    "non-wildcard"
    
    ...if /channels/externalMedia was registered as a handler after
    /channels/{channelId} as shown above, the request would automatically
    match the wildcard handler and attempt to parse "externalMedia" into
    the channelId variable which isn't what was intended.  It'd work
    if the non-wildard entry was defined in rest-api/api-docs/channels.json
    before the wildcard entry but that makes the json files
    order-dependent which isn't a good thing.
    
    To combat this issue, the search loop saves any wildcard match but
    continues looking for exact matches at the same level.  If it finds
    one, it's used.  If it hasn't found an exact match at the end of
    the current level, the wildcard is used.  Regardless, after
    searching the current level, the wildcard is cleared so it won't
    accidentally match for a different object or a higher level.
    
    BTW, it's currently not possible for more than 1 wildcard entry
    to be defined for a level.  For instance, there couldn't be:
    Handler: /channels/{channelId}
    Handler: /channels/{channelName}
    We wouldn't know which one to match.
    
    Change-Id: I574aa3cbe4249c92c30f74b9b40e750e9002f925
    8da4e28a
    History
    res_ari.c: Prefer exact handler match over wildcard
    George Joseph authored
    Given the following request path and 2 handler paths...
    Request: /channels/externalMedia
    Handler: /channels/{channelId}      "wildcard"
    Handler: /channels/externalmedia    "non-wildcard"
    
    ...if /channels/externalMedia was registered as a handler after
    /channels/{channelId} as shown above, the request would automatically
    match the wildcard handler and attempt to parse "externalMedia" into
    the channelId variable which isn't what was intended.  It'd work
    if the non-wildard entry was defined in rest-api/api-docs/channels.json
    before the wildcard entry but that makes the json files
    order-dependent which isn't a good thing.
    
    To combat this issue, the search loop saves any wildcard match but
    continues looking for exact matches at the same level.  If it finds
    one, it's used.  If it hasn't found an exact match at the end of
    the current level, the wildcard is used.  Regardless, after
    searching the current level, the wildcard is cleared so it won't
    accidentally match for a different object or a higher level.
    
    BTW, it's currently not possible for more than 1 wildcard entry
    to be defined for a level.  For instance, there couldn't be:
    Handler: /channels/{channelId}
    Handler: /channels/{channelName}
    We wouldn't know which one to match.
    
    Change-Id: I574aa3cbe4249c92c30f74b9b40e750e9002f925
res_ari.c 36.47 KiB