Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

7.13 MG_EV_READ event has no data #2631

Closed
kylemilz opened this issue Feb 28, 2024 · 1 comment
Closed

7.13 MG_EV_READ event has no data #2631

kylemilz opened this issue Feb 28, 2024 · 1 comment

Comments

@kylemilz
Copy link

Hi,

We have an application that uses both MG_EV_HTTP_MSG and MG_EV_READ events to process both complete HTTP requests and partial requests depending on the URL. In mongoose 7.12, we have observed that MG_EV_READ is called before MG_EV_HTTP_MSG which makes sense to us because we have a chance to process a partial HTTP request if needed. Also in this case, if we consume all of the data, MG_EV_HTTP_MSG does not fire.

In 7.13 I am seeing MG_EV_HTTP_MSG event before MG_EV_READ and it consumes all of the received data before we have a chance to process it with MG_EV_READ. Look at this example program below, for 7.12:

sitecntrl:~/mongoose$ git checkout 7.12
HEAD is now at 32559f15 fix Github editor line ending creativity
sitecntrl:~/mongoose$ cat test.c
#include <err.h>

#include "mongoose.h"


static void
fn(struct mg_connection *c, int ev, void *ev_data, void *)
{
        if (ev == MG_EV_HTTP_MSG) {
                printf(">>> MG_EV_HTTP_MSG\n");
        }
        else if (ev == MG_EV_READ) {
                printf(">>> MG_EV_READ, c->recv.len = %d\n", c->recv.len);
                c->recv.len = 0;
        }
}

int
main(int argc, char *argv[])
{
        struct mg_mgr mgr;

        mg_mgr_init(&mgr);
        mg_http_listen(&mgr, "http://0.0.0.0:8000", fn, &mgr);

        while (1)
                mg_mgr_poll(&mgr, 1000);

        mg_mgr_free(&mgr);

        return 0;
}
sitecntrl:~/mongoose$ cc -o read test.c mongoose.c
sitecntrl:~/mongoose$ ./read
(switch to other terminal)
sitecntrl:~/mongoose$ curl http://127.0.0.1:8000
(switch back)
>>> MG_EV_READ, c->recv.len = 78

This makes sense to me. MG_EV_READ is called, consumes that data (sets recv.len = 0), then MG_EV_HTTP_MSG is not called because there is no more data.

But look at what happens in 7.13. Example program slightly modified to cope with signature change:

sitecntrl:~/mongoose$ git checkout 7.13
HEAD is now at 52997c6c update version
sitecntrl:~/mongoose$ cat test.c
#include <err.h>

#include "mongoose.h"


static void
fn(struct mg_connection *c, int ev, void *ev_data)
{
        if (ev == MG_EV_HTTP_MSG) {
                printf(">>> MG_EV_HTTP_MSG\n");
        }
        else if (ev == MG_EV_READ) {
                printf(">>> MG_EV_READ, c->recv.len = %d\n", c->recv.len);
                c->recv.len = 0;
        }
}

int
main(int argc, char *argv[])
{
        struct mg_mgr mgr;

        mg_mgr_init(&mgr);
        mg_http_listen(&mgr, "http://0.0.0.0:8000", fn, &mgr);

        while (1)
                mg_mgr_poll(&mgr, 1000);

        mg_mgr_free(&mgr);

        return 0;
}
sitecntrl:~/mongoose$ cc -o read test.c mongoose.c
sitecntrl:~/mongoose$ ./read
(switch to other terminal)
sitecntrl:~/mongoose$ curl http://127.0.0.1:8000
(switch back)
>>> MG_EV_HTTP_MSG
>>> MG_EV_READ, c->recv.len = 0

You can see that MG_EV_HTTP_MSG has fired before MG_EV_READ and presumably consumed all of the recv buffer data. Is this expected behavior?

Environment

  • mongoose version: 7.12/7.13
  • Compiler/IDE and SDK: gcc 11.3.0
  • Target hardware/board: Arm Cortex A7
  • Target RTOS/OS (if applicable): Linux 5.15
@scaprile
Copy link
Collaborator

That change is intentional #2581
Please see how we changed similar examples in that and related PRs
#2581 (comment)
Let us know if you need more help

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants