We do our best to document all the breaking changes. However, we often find out about them not because we did them deliberately.
For example, in this release, the login-key management endpoints were migrated from the old codebase (written in one programming language, using a handwritten http library) to the new codebase (written in a different programming language, using a standard http library). The new codebase with modern http library is already being used for more than three years for various DA endpoints (even quite important ones like CMD_API_DATABASES, etc.). And we have never received a report that someone is using multipart/form-data content encoding for requests that does not upload files.
But apparently, when login-key management endpoints were migrated it revealed, that someone was abusing the quirk of the old http library in this way. So the change when we used the new library was made three years ago, yet the problem manifested after a long time with completely unrelated changes.
Quick demo of the side-effects:
Code:
# da update stable
# time curl -s "$(da api-url)/CMD_LOGIN_KEYS?json=yes" --data-raw 'action=create&type=key&keyname=test&key=AzYhfiFjlpcDtGMSFPA0SxnbniuF7gVL&key2=AzYhfiFjlpcDtGMSFPA0SxnbniuF7gVL&never_expires=yes'
{
"result": "AzYhfiFjlpcDtGMSFPA0SxnbniuF7gVL",
"success": "Key Created. Take note of it's value and keep it safe."
}
real 0m0.251s
user 0m0.019s
sys 0m0.009s
# time curl -s "$(da api-url)/CMD_LOGIN_KEYS?json=yes" --data-raw 'select1=test&delete=Delete&action=select'
{
"result": "",
"success": "Key(s) deleted"
}
real 0m0.248s
user 0m0.019s
sys 0m0.008s
Code:
# da update current
# time curl -s "$(da api-url)/CMD_LOGIN_KEYS?json=yes" --data-raw 'action=create&type=key&keyname=test&key=AzYhfiFjlpcDtGMSFPA0SxnbniuF7gVL&key2=AzYhfiFjlpcDtGMSFPA0SxnbniuF7gVL&never_expires=yes'
{"result":"AzYhfiFjlpcDtGMSFPA0SxnbniuF7gVL","success":"Key Created. Take note of it's value and keep it safe."}
real 0m0.180s
user 0m0.024s
sys 0m0.000s
# time curl -s "$(da api-url)/CMD_LOGIN_KEYS?json=yes" --data-raw 'select1=test&delete=Delete&action=select'
{"result":"","success":"Key(s) deleted"}
real 0m0.117s
user 0m0.024s
sys 0m0.006s
The new codebase is 1.5x–2x times faster. Trying to write out all the things it does differently is not trivial. For example, even in the requests above, it is easy to spot a difference. The new codebase outputs JSON in compact form. If someone was expecting to find the result string on the second line of the response, their application would break. The result is now always single-line, so there is no "second line." This is a good example of how a poor API client could depend on quirks of the old http library.