lwip-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [lwip-devel] httpd and CGI handler call


From: Giuseppe Modugno
Subject: Re: [lwip-devel] httpd and CGI handler call
Date: Fri, 24 Nov 2017 10:20:54 +0100
User-agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0

You're right. Here it is my diff of httpd.c. As you can see, it's only a relocation of a small piece of code in http_init_file() function.

The goal of this change is to let CGI handler function setting file info (mainly file->len, file->data and file->index), before they are processed in http_init_file(), i.e. hs->file and hs->left are assigned to file info.

Please, share your examples so we can discuss on them. Thank you.

Il 23/11/2017 21:52, address@hidden ha scritto:
Honestly, I can't really follow all your mails here. I lost trace of what's good and what's bad.
I'm in the process of adding httpd examples to the contrib repository. Your CGI/generated file combination is one of the next.

I'd suggest that I push my example (hopefully next week) and then let's discuss your thoughts again by sharing diffs. Looking at diffs is *much* easier than following 5 emails of textual descriptions...

Simon


Giuseppe Modugno:

I need to answer to GET /login.cgi?user=admin&pwd=admin request with JSON data. The answer depends on parameters user and pwd passed as query string.

I can't create the answer in fs_open_custom(), because parameters aren't available. Even the answer buffer can't be allocated in fs_open_custom(), because the answer length isn't known yet. In CGI handler I can allocate and create the answer, however I can't set the file content, because I can't access file structure.

One solution is to use LWIP_HTTPD_DYNAMIC_FILE_READ and implement a trivial fs_read_custom(). I think a better solution could be to use LWIP_HTTPD_FILE_STATE, set file->state as file in fs_open_custom() and set file content in CGI handler.

int fs_open_custom(struct fs_file *file, const char *name) {
  if (!strcmp(name, "/login.cgi")) {
        file->state = file;
  }
}

void httpd_cgi_handler(const char *filename, int iNumParams, char **pcParam, char **pcValue, void *file_state) {
  if (!strcmp(filename, "/login.cgi")) {
    struct fs_file *file = (struct fs_file *)file_state;
    void *reply_buf = malloc(answer_length);
    file->data = "">
    file->len = file->index = strlen(reply_buf);
}

This doesn't work, because in http_init_file() hs->handle, hs->file and hs->left are assigned before calling CGI httpd_cgi_handler().

However this could work if httpd_cgi_handler() is moved before assigning hs->handle, hs->file and hs->left. I tried and it seems it works.


IMHO another good modification could be to pass file to httpd_cgi_handler(), instead of only file->state. In the handler, you will have the access to file and file->state. With this change, you could avoid assigning file->state=file in fs_open_custom() that could be empty.




_______________________________________________
lwip-devel mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/lwip-devel




_______________________________________________
lwip-devel mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/lwip-devel

Attachment: patch.diff
Description: Text document


reply via email to

[Prev in Thread] Current Thread [Next in Thread]