Added JavaScript-friendly ssi /*#tag*/.

This commit is contained in:
Lucas Vinicius Hartmann 2018-06-13 11:05:58 +02:00 committed by Simon Goldschmidt
parent 58f928a181
commit 0acf37fd75
2 changed files with 27 additions and 12 deletions

View File

@ -217,6 +217,8 @@ struct http_ssi_state {
#if !LWIP_HTTPD_SSI_INCLUDE_TAG #if !LWIP_HTTPD_SSI_INCLUDE_TAG
const char *tag_started;/* Pointer to the first opening '<' of the tag. */ const char *tag_started;/* Pointer to the first opening '<' of the tag. */
#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG */ #endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG */
const char *lead_in; /* Lead in for the potential current tag type. */
const char *lead_out; /* Lead out for the current tag type. */
const char *tag_end; /* Pointer to char after the closing '>' of the tag. */ const char *tag_end; /* Pointer to char after the closing '>' of the tag. */
u32_t parse_left; /* Number of unparsed bytes in buf. */ u32_t parse_left; /* Number of unparsed bytes in buf. */
u16_t tag_index; /* Counter used by tag parsing state machine */ u16_t tag_index; /* Counter used by tag parsing state machine */
@ -316,11 +318,11 @@ static int httpd_num_tags;
static const char **httpd_tags; static const char **httpd_tags;
#endif /* !LWIP_HTTPD_SSI_RAW */ #endif /* !LWIP_HTTPD_SSI_RAW */
#define LEN_TAG_LEAD_IN 5
static const char httpd_tag_lead_in[] = "<!--#"; static const char httpd_tag_lead_in[] = "<!--#";
#define LEN_TAG_LEAD_OUT 3
static const char httpd_tag_lead_out[] = "-->"; static const char httpd_tag_lead_out[] = "-->";
static const char httpd_tag_lead_in_js[] = "/*#";
static const char httpd_tag_lead_out_js[] = "*/";
#endif /* LWIP_HTTPD_SSI */ #endif /* LWIP_HTTPD_SSI */
#if LWIP_HTTPD_CGI #if LWIP_HTTPD_CGI
@ -1254,6 +1256,19 @@ http_send_data_ssi(struct altcp_pcb *pcb, struct http_state *hs)
if (*ssi->parsed == httpd_tag_lead_in[0]) { if (*ssi->parsed == httpd_tag_lead_in[0]) {
/* We found what could be the lead-in for a new tag so change /* We found what could be the lead-in for a new tag so change
* state appropriately. */ * state appropriately. */
ssi->lead_in = httpd_tag_lead_in;
ssi->lead_out = httpd_tag_lead_out;
ssi->tag_state = TAG_LEADIN;
ssi->tag_index = 1;
#if !LWIP_HTTPD_SSI_INCLUDE_TAG
ssi->tag_started = ssi->parsed;
#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG */
}
if (*ssi->parsed == httpd_tag_lead_in_js[0]) {
/* We found what could be the lead-in for a new tag so change
* state appropriately. */
ssi->lead_in = httpd_tag_lead_in_js;
ssi->lead_out = httpd_tag_lead_out_js;
ssi->tag_state = TAG_LEADIN; ssi->tag_state = TAG_LEADIN;
ssi->tag_index = 1; ssi->tag_index = 1;
#if !LWIP_HTTPD_SSI_INCLUDE_TAG #if !LWIP_HTTPD_SSI_INCLUDE_TAG
@ -1271,12 +1286,12 @@ http_send_data_ssi(struct altcp_pcb *pcb, struct http_state *hs)
* the tag name. */ * the tag name. */
/* Have we reached the end of the leadin? */ /* Have we reached the end of the leadin? */
if (ssi->tag_index == LEN_TAG_LEAD_IN) { if (ssi->lead_in[ssi->tag_index] == 0) {
ssi->tag_index = 0; ssi->tag_index = 0;
ssi->tag_state = TAG_FOUND; ssi->tag_state = TAG_FOUND;
} else { } else {
/* Have we found the next character we expect for the tag leadin? */ /* Have we found the next character we expect for the tag leadin? */
if (*ssi->parsed == httpd_tag_lead_in[ssi->tag_index]) { if (*ssi->parsed == ssi->lead_in[ssi->tag_index]) {
/* Yes - move to the next one unless we have found the complete /* Yes - move to the next one unless we have found the complete
* leadin, in which case we start looking for the tag itself */ * leadin, in which case we start looking for the tag itself */
ssi->tag_index++; ssi->tag_index++;
@ -1309,7 +1324,7 @@ http_send_data_ssi(struct altcp_pcb *pcb, struct http_state *hs)
/* Have we found the end of the tag name? This is signalled by /* Have we found the end of the tag name? This is signalled by
* us finding the first leadout character or whitespace */ * us finding the first leadout character or whitespace */
if ((*ssi->parsed == httpd_tag_lead_out[0]) || if ((*ssi->parsed == ssi->lead_out[0]) ||
(*ssi->parsed == ' ') || (*ssi->parsed == '\t') || (*ssi->parsed == ' ') || (*ssi->parsed == '\t') ||
(*ssi->parsed == '\n') || (*ssi->parsed == '\r')) { (*ssi->parsed == '\n') || (*ssi->parsed == '\r')) {
@ -1323,7 +1338,7 @@ http_send_data_ssi(struct altcp_pcb *pcb, struct http_state *hs)
LWIP_ASSERT("ssi->tag_index <= 0xff", ssi->tag_index <= 0xff); LWIP_ASSERT("ssi->tag_index <= 0xff", ssi->tag_index <= 0xff);
ssi->tag_name_len = (u8_t)ssi->tag_index; ssi->tag_name_len = (u8_t)ssi->tag_index;
ssi->tag_name[ssi->tag_index] = '\0'; ssi->tag_name[ssi->tag_index] = '\0';
if (*ssi->parsed == httpd_tag_lead_out[0]) { if (*ssi->parsed == ssi->lead_out[0]) {
ssi->tag_index = 1; ssi->tag_index = 1;
} else { } else {
ssi->tag_index = 0; ssi->tag_index = 0;
@ -1359,7 +1374,7 @@ http_send_data_ssi(struct altcp_pcb *pcb, struct http_state *hs)
} }
/* Have we found the next character we expect for the tag leadout? */ /* Have we found the next character we expect for the tag leadout? */
if (*ssi->parsed == httpd_tag_lead_out[ssi->tag_index]) { if (*ssi->parsed == ssi->lead_out[ssi->tag_index]) {
/* Yes - move to the next one unless we have found the complete /* Yes - move to the next one unless we have found the complete
* leadout, in which case we need to call the client to process * leadout, in which case we need to call the client to process
* the tag. */ * the tag. */
@ -1367,8 +1382,9 @@ http_send_data_ssi(struct altcp_pcb *pcb, struct http_state *hs)
/* Move on to the next character in the buffer */ /* Move on to the next character in the buffer */
ssi->parse_left--; ssi->parse_left--;
ssi->parsed++; ssi->parsed++;
ssi->tag_index++;
if (ssi->tag_index == (LEN_TAG_LEAD_OUT - 1)) { if (ssi->lead_out[ssi->tag_index] == 0) {
/* Call the client to ask for the insert string for the /* Call the client to ask for the insert string for the
* tag we just found. */ * tag we just found. */
#if LWIP_HTTPD_SSI_MULTIPART #if LWIP_HTTPD_SSI_MULTIPART
@ -1410,8 +1426,6 @@ http_send_data_ssi(struct altcp_pcb *pcb, struct http_state *hs)
hs->left -= len; hs->left -= len;
} }
} }
} else {
ssi->tag_index++;
} }
} else { } else {
/* We found an unexpected character so this is not a tag. Move /* We found an unexpected character so this is not a tag. Move

View File

@ -150,7 +150,8 @@ extern void httpd_cgi_handler(struct fs_file *file, const char* uri, int iNumPar
* resemble an HTML comment but this syntax does not constitute a comment * resemble an HTML comment but this syntax does not constitute a comment
* within JavaScript and, hence, leaving the tag in place will result in * within JavaScript and, hence, leaving the tag in place will result in
* problems in these cases. In order to avoid these problems, define * problems in these cases. In order to avoid these problems, define
* LWIP_HTTPD_SSI_INCLUDE_TAG as zero in your lwip options file. * LWIP_HTTPD_SSI_INCLUDE_TAG as zero in your lwip options file, or use JavaScript
* style block comments in the form / * # name * / (without the spaces).
*/ */
typedef u16_t (*tSSIHandler)( typedef u16_t (*tSSIHandler)(
#if LWIP_HTTPD_SSI_RAW #if LWIP_HTTPD_SSI_RAW