Created by: ityuhui
When using libcurl to get the http response, the application program needs to configure the write-data callback function.
curl_easy_setopt(handle,
CURLOPT_WRITEFUNCTION,
writeDataCallback);
curl_easy_setopt(handle,
CURLOPT_WRITEDATA,
&apiClient->dataReceived);
When libcurl receives data(http response), it will call the callback function (defined in openapi-generator/c-libcurl)
size_t writeDataCallback(void *buffer, size_t size, size_t nmemb, void *userp) {
...
}
to put the data from void *buffer
to user's memory location void *userp
(&apiClient->dataReceived).
But sometimes (commonly the response data is big) for a http request, the response data will be divided to multiple parts and sent by multiple times, so the callback function writeDataCallback
will be called multiple times.
The current writeDataCallback will lose the data the last time received:
size_t writeDataCallback(void *buffer, size_t size, size_t nmemb, void *userp) {
*(char **) userp = strdup(buffer); <=== The old userp will be discarded, and userp points to a new memory.
return size * nmemb;
}
So I changed the apiClient_t and writeDataCallback
typedef struct apiClient_t {
...
long dataReceivedLen;
...
} apiClient_t;
curl_easy_setopt(handle,
CURLOPT_WRITEDATA,
apiClient);
size_t writeDataCallback(void *buffer, size_t size, size_t nmemb, void *userp) {
size_t size_this_time = nmemb * size;
apiClient_t *apiClient = (apiClient_t *)userp;
apiClient->dataReceived = (char *)realloc( apiClient->dataReceived, apiClient->dataReceivedLen + size_this_time + 1); <== now the previous data will be reserved.
memcpy(apiClient->dataReceived + apiClient->dataReceivedLen, buffer, size_this_time);
apiClient->dataReceivedLen += size_this_time;
return size_this_time;
}
PR checklist
-
Read the contribution guidelines. -
If contributing template-only or documentation-only changes which will change sample output, build the project before. -
Run the shell script(s) under ./bin/
(or Windows batch scripts under.\bin\windows
) to update Petstore samples related to your fix. This is important, as CI jobs will verify all generator outputs of your HEAD commit, and these must match the expectations made by your contribution. You only need to run./bin/{LANG}-petstore.sh
,./bin/openapi3/{LANG}-petstore.sh
if updating the code or mustache templates for a language ({LANG}
) (e.g. php, ruby, python, etc). -
File the PR against the correct branch: master
,4.3.x
,5.0.x
. Default:master
. -
Copy the technical committee to review the pull request if your PR is targeting a particular programming language.
@wing328 @zhemant @michelealbano