Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • O openapi-generator
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 3,476
    • Issues 3,476
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 402
    • Merge requests 402
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • OpenAPI Tools
  • openapi-generator
  • Merge requests
  • !5828

[C][Client]Fix data lost when libcurl write-data callback function is called multiple times

  • Review changes

  • Download
  • Email patches
  • Plain diff
Merged Administrator requested to merge github/fork/ityuhui/yhlibcurlwrite into master Apr 05, 2020
  • Overview 0
  • Commits 3
  • Pipelines 0
  • Changes 8

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;
}

Reference: https://stackoverflow.com/questions/3573146/problem-using-libcurl-it-does-not-appear-to-get-the-entire-page

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

Assignee
Assign to
Reviewers
Request review from
Time tracking
Source branch: github/fork/ityuhui/yhlibcurlwrite