[ 
https://issues.apache.org/jira/browse/TS-3956?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14943003#comment-14943003
 ] 

ASF GitHub Bot commented on TS-3956:
------------------------------------

GitHub user bgaff opened a pull request:

    https://github.com/apache/trafficserver/pull/300

    TS-3956: Header_rewrite applies strange logic with = operator

    Please see ticket TS-3956 for more information, I'm using github here so 
that @zwoop / @jacksontj can provide a code review.
    
    It appears that whitespace causes weird behavior with header_rewrite, for 
example:
    If you remove the white space before the = and the quotes it appears to 
behave correctly. This whitespace issue is likely to cause strange bugs and 
needs to be fixed.
    
    ```
    cond %{READ_REQUEST_HDR_HOOK}
    cond %{CLIENT-HEADER:Host} /^localhost$/ [AND]
    cond %{CLIENT-HEADER:non_existent_header} = "shouldnt_exist_anyway" [AND]
    add-header X-HeaderRewriteApplied true
    ```
    With the following request:
    
    ```
    curl -v localhost/
    ```
    
    Header_rewrite will incorrectly apply the rule:
    
    ```
    [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) 
Building resources, hook=TS_HTTP_READ_REQUEST_HDR_HOOK
    [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite)        
Adding TXN client request header buffers
    [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) 
Getting Header: Host, field_loc: 0x7fffd02070d0
    [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) 
Appending HEADER(Host) to evaluation value -> localhost
    [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) Test 
regular expression ^localhost$ : localhost
    [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) 
Successfully found regular expression match
    [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) 
Evaluating HEADER(): localhost - rval: 1
    [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) 
Getting Header: non_existent_header, field_loc: (nil)
    [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) 
Evaluating HEADER():  - rval: 1
    [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) 
OperatorAddHeader::exec() invoked on header X-HeaderRewriteApplied: true
    [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite)    
Adding header X-HeaderRewriteApplied
    ```
    I have a proposed patch incoming it maintains backwards compatability while 
being a little more flexible with whitespace, for example the following config 
will parse as:
    
    ```
    cond %{READ_REQUEST_HDR_HOOK}
    cond %{CLIENT-HEADER:Host} /^localhost$/            [AND]
       cond %{CLIENT-HEADER:Host}    =a
         # COMMENT!
    # COMMENT
       cond %{Client-HEADER:Foo} =b
       cond %{Client-HEADER:Blah}       =        x
    cond %{CLIENT-HEADER:non_existent_header} =  "shouldnt_   exist    _anyway" 
         [AND]
    cond %{CLIENT-HEADER:non_existent_header} =  "shouldnt_   =    _anyway"     
     [AND]
    cond %{CLIENT-HEADER:non_existent_header} ="="          [AND]
    cond %{CLIENT-HEADER:non_existent_header} =""          [AND]
    add-header X-HeaderRewriteApplied true
    ```
    
    ```
    $1 = std::vector of length 2, capacity 2 = {"cond", 
"%{READ_REQUEST_HDR_HOOK}"}
    $2 = std::vector of length 4, capacity 4 = {"cond", 
"%{CLIENT-HEADER:Host}", "/^localhost$/", "[AND]"}
    $3 = std::vector of length 4, capacity 4 = {"cond", 
"%{CLIENT-HEADER:Host}", "=", "a"}
    $4 = std::vector of length 4, capacity 4 = {"cond", "%{Client-HEADER:Foo}", 
"=", "b"}
    $5 = std::vector of length 4, capacity 4 = {"cond", 
"%{Client-HEADER:Blah}", "=", "x"}
    $6 = std::vector of length 5, capacity 8 = {"cond", 
"%{CLIENT-HEADER:non_existent_header}", "=", "shouldnt_   exist    _anyway", 
"[AND]"}
    $7 = std::vector of length 5, capacity 8 = {"cond", 
"%{CLIENT-HEADER:non_existent_header}", "=", "shouldnt_   =    _anyway", 
"[AND]"}
    $8 = std::vector of length 5, capacity 8 = {"cond", 
"%{CLIENT-HEADER:non_existent_header}", "=", "=", "[AND]"}
    $9 = std::vector of length 5, capacity 8 = {"cond", 
"%{CLIENT-HEADER:non_existent_header}", "=", "", "[AND]"}
    $10 = std::vector of length 3, capacity 4 = {"add-header", 
"X-HeaderRewriteApplied", "true"}
    ```

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/bgaff/trafficserver master

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/trafficserver/pull/300.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #300
    
----
commit bd3f2a8a3da46b0a4c59c5cb1a2509be9b02c0dd
Author: Brian Geffon <[email protected]>
Date:   2015-10-05T07:23:45Z

    TS-3956: Header_rewrite applies strange logic with = operator and whitespace

----


> Header_rewrite applies strange logic with = operator and whitespace
> -------------------------------------------------------------------
>
>                 Key: TS-3956
>                 URL: https://issues.apache.org/jira/browse/TS-3956
>             Project: Traffic Server
>          Issue Type: Bug
>          Components: Plugins
>            Reporter: Brian Geffon
>            Assignee: Brian Geffon
>
> It appears that whitespace causes weird behavior with header_rewrite, for 
> example:
> If you remove the white space before the = and the quotes it appears to 
> behave correctly. This whitespace issue is likely to cause strange bugs and 
> needs to be fixed.
> {code}
> cond %{READ_REQUEST_HDR_HOOK}
> cond %{CLIENT-HEADER:Host} /^localhost$/ [AND]
> cond %{CLIENT-HEADER:non_existent_header} = "shouldnt_exist_anyway" [AND]
> add-header X-HeaderRewriteApplied true
> {code}
> With the following request:
> {code}
> curl -v localhost/
> {code}
> Header_rewrite will incorrectly apply the rule:
> {code}
> [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) Building 
> resources, hook=TS_HTTP_READ_REQUEST_HDR_HOOK
> [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite)  Adding 
> TXN client request header buffers
> [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) Getting 
> Header: Host, field_loc: 0x7fffd02070d0
> [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) 
> Appending HEADER(Host) to evaluation value -> localhost
> [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) Test 
> regular expression ^localhost$ : localhost
> [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) 
> Successfully found regular expression match
> [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) 
> Evaluating HEADER(): localhost - rval: 1
> [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) Getting 
> Header: non_existent_header, field_loc: (nil)
> [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) 
> Evaluating HEADER():  - rval: 1
> [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite) 
> OperatorAddHeader::exec() invoked on header X-HeaderRewriteApplied: true
> [Oct  4 20:56:49.245] Server {0x7ffff61b5700} DIAG: (header_rewrite)    
> Adding header X-HeaderRewriteApplied
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to