Skip to content
  • Sam Habiel's avatar
    [#139] Extra response data from global when due to incorrect $query termination · 20fa5efa
    Sam Habiel authored
    How to reproduce
    ----------------
    `gloreturn^%ydbwebapi` uses a global reference as response data and can
    be used to demonstrate the problem.
    
    1. Start the web server: `yottadb -run start^%ydbwebreq`
    
    2. Run:
    
    ```
    $ ydb -run ^%XCMD 'kill ^web set ^web("z")="WRONG DATA" zwr ^web'
    ^web("z")="WRONG DATA"
    ```
    
    3. Run:
    
    ```
    ~$ printf 'GET /test/gloreturn HTTP/1.1\r\n\r\n' | nc localhost 9080
    HTTP/1.1 200 OK
    Date: Fri, 01 Mar 2024 08:35:00 GMT
    Content-Type: text/plain; charset=utf-8
    Access-Control-Allow-Origin: *
    Content-Length: 15
    
    coo
    boo
    foo
    WRONG DATA
    ```
    
    Diagnosis
    ---------
    The $query loop in `src/_ydbwebrsp.m` sent data after doing $query but
    before it checked that it finished with the global. The order is now
    reversed, and it it's now fixed. The code now has been made simpler, as
    it was trying to be stupidly bullet proof against conditions which
    cannot exist (like checking if the node returned by $query has a
    value... by definition, if $query returned it, it has a value).
    
    Tests
    -----
    - gloreturn -> gloreturn1
    - gloreturn1 was previously disabled when we migrated the M-Web-Server
      to the YDB-Web-Server, as we didn't want to use globals. Since then,
      some use cases for globals encroached, and we have a framework for
      creating a temporary database file to use for globals.
    - gloreturn1 tests $query with a subscripted global, and makes sure that
      this issue is fixed.
    - gloreturn2 tests $query with an unsubscripted global.
    
    Version bumped to 4.4.2 for a bug fix.
    20fa5efa