mirror of
https://git.savannah.nongnu.org/git/lwip.git
synced 2026-05-24 09:06:55 +08:00
Cleanup handling of non-standard functions in lwIP
- itoa - strnicmp, stricmp/strcasecmp - strnstr Related to patch #9115: httpd.c: strcasecmp for GCC and stricmp for Windows
This commit is contained in:
@@ -337,82 +337,6 @@ char *http_cgi_param_vals[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Values for each ext
|
||||
static struct http_state *http_connections;
|
||||
#endif /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */
|
||||
|
||||
#if LWIP_HTTPD_STRNSTR_PRIVATE
|
||||
/** Like strstr but does not need 'buffer' to be NULL-terminated */
|
||||
static char*
|
||||
strnstr(const char* buffer, const char* token, size_t n)
|
||||
{
|
||||
const char* p;
|
||||
int tokenlen = (int)strlen(token);
|
||||
if (tokenlen == 0) {
|
||||
return (char *)(size_t)buffer;
|
||||
}
|
||||
for (p = buffer; *p && (p + tokenlen <= buffer + n); p++) {
|
||||
if ((*p == *token) && (strncmp(p, token, tokenlen) == 0)) {
|
||||
return (char *)(size_t)p;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
#endif /* LWIP_HTTPD_STRNSTR_PRIVATE */
|
||||
|
||||
#if LWIP_HTTPD_STRICMP_PRIVATE
|
||||
static int
|
||||
stricmp(const char* str1, const char* str2)
|
||||
{
|
||||
char c1, c2;
|
||||
|
||||
do {
|
||||
c1 = *str1++;
|
||||
c2 = *str2++;
|
||||
if (c1 != c2) {
|
||||
char c1_upc = c1 | 0x20;
|
||||
if ((c1_upc >= 'a') && (c1_upc <= 'z')) {
|
||||
/* characters are not equal an one is in the alphabet range:
|
||||
downcase both chars and check again */
|
||||
char c2_upc = c2 | 0x20;
|
||||
if (c1_upc != c2_upc) {
|
||||
/* still not equal */
|
||||
/* don't care for < or > */
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
/* characters are not equal but none is in the alphabet range */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
} while (c1 != 0);
|
||||
return 0;
|
||||
}
|
||||
#endif /* LWIP_HTTPD_STRICMP_PRIVATE */
|
||||
|
||||
#if LWIP_HTTPD_ITOA_PRIVATE && LWIP_HTTPD_DYNAMIC_HEADERS
|
||||
static void
|
||||
httpd_itoa(int value, char* result)
|
||||
{
|
||||
const int base = 10;
|
||||
char* ptr = result, *ptr1 = result, tmp_char;
|
||||
int tmp_value;
|
||||
|
||||
do {
|
||||
tmp_value = value;
|
||||
value /= base;
|
||||
*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];
|
||||
} while(value);
|
||||
|
||||
/* Apply negative sign */
|
||||
if (tmp_value < 0) {
|
||||
*ptr++ = '-';
|
||||
}
|
||||
*ptr-- = '\0';
|
||||
while(ptr1 < ptr) {
|
||||
tmp_char = *ptr;
|
||||
*ptr--= *ptr1;
|
||||
*ptr1++ = tmp_char;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED
|
||||
static void
|
||||
http_kill_oldest_connection(u8_t ssi_required)
|
||||
@@ -964,7 +888,7 @@ get_http_headers(struct http_state *hs, const char *uri)
|
||||
/* Now determine the content type and add the relevant header for that. */
|
||||
for (content_type = 0; content_type < NUM_HTTP_HEADERS; content_type++) {
|
||||
/* Have we found a matching extension? */
|
||||
if(!stricmp(g_psHTTPHeaders[content_type].extension, ext)) {
|
||||
if(!lwip_stricmp(g_psHTTPHeaders[content_type].extension, ext)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1012,7 +936,7 @@ get_http_headers(struct http_state *hs, const char *uri)
|
||||
}
|
||||
if (add_content_len) {
|
||||
size_t len;
|
||||
LWIP_HTTPD_ITOA(hs->hdr_content_len, (size_t)LWIP_HTTPD_MAX_CONTENT_LEN_SIZE,
|
||||
lwip_itoa(hs->hdr_content_len, (size_t)LWIP_HTTPD_MAX_CONTENT_LEN_SIZE,
|
||||
hs->handle->len);
|
||||
len = strlen(hs->hdr_content_len);
|
||||
if (len <= LWIP_HTTPD_MAX_CONTENT_LEN_SIZE - LWIP_HTTPD_MAX_CONTENT_LEN_OFFSET) {
|
||||
@@ -1802,16 +1726,16 @@ http_post_request(struct pbuf *inp, struct http_state *hs,
|
||||
{
|
||||
err_t err;
|
||||
/* search for end-of-header (first double-CRLF) */
|
||||
char* crlfcrlf = strnstr(uri_end + 1, CRLF CRLF, data_len - (uri_end + 1 - data));
|
||||
char* crlfcrlf = lwip_strnstr(uri_end + 1, CRLF CRLF, data_len - (uri_end + 1 - data));
|
||||
|
||||
if (crlfcrlf != NULL) {
|
||||
/* search for "Content-Length: " */
|
||||
#define HTTP_HDR_CONTENT_LEN "Content-Length: "
|
||||
#define HTTP_HDR_CONTENT_LEN_LEN 16
|
||||
#define HTTP_HDR_CONTENT_LEN_DIGIT_MAX_LEN 10
|
||||
char *scontent_len = strnstr(uri_end + 1, HTTP_HDR_CONTENT_LEN, crlfcrlf - (uri_end + 1));
|
||||
char *scontent_len = lwip_strnstr(uri_end + 1, HTTP_HDR_CONTENT_LEN, crlfcrlf - (uri_end + 1));
|
||||
if (scontent_len != NULL) {
|
||||
char *scontent_len_end = strnstr(scontent_len + HTTP_HDR_CONTENT_LEN_LEN, CRLF, HTTP_HDR_CONTENT_LEN_DIGIT_MAX_LEN);
|
||||
char *scontent_len_end = lwip_strnstr(scontent_len + HTTP_HDR_CONTENT_LEN_LEN, CRLF, HTTP_HDR_CONTENT_LEN_DIGIT_MAX_LEN);
|
||||
if (scontent_len_end != NULL) {
|
||||
int content_len;
|
||||
char *content_len_num = scontent_len + HTTP_HDR_CONTENT_LEN_LEN;
|
||||
@@ -2020,7 +1944,7 @@ http_parse_request(struct pbuf *inp, struct http_state *hs, struct tcp_pcb *pcb)
|
||||
/* received enough data for minimal request? */
|
||||
if (data_len >= MIN_REQ_LEN) {
|
||||
/* wait for CRLF before parsing anything */
|
||||
crlf = strnstr(data, CRLF, data_len);
|
||||
crlf = lwip_strnstr(data, CRLF, data_len);
|
||||
if (crlf != NULL) {
|
||||
#if LWIP_HTTPD_SUPPORT_POST
|
||||
int is_post = 0;
|
||||
@@ -2052,11 +1976,11 @@ http_parse_request(struct pbuf *inp, struct http_state *hs, struct tcp_pcb *pcb)
|
||||
}
|
||||
/* if we come here, method is OK, parse URI */
|
||||
left_len = (u16_t)(data_len - ((sp1 +1) - data));
|
||||
sp2 = strnstr(sp1 + 1, " ", left_len);
|
||||
sp2 = lwip_strnstr(sp1 + 1, " ", left_len);
|
||||
#if LWIP_HTTPD_SUPPORT_V09
|
||||
if (sp2 == NULL) {
|
||||
/* HTTP 0.9: respond with correct protocol version */
|
||||
sp2 = strnstr(sp1 + 1, CRLF, left_len);
|
||||
sp2 = lwip_strnstr(sp1 + 1, CRLF, left_len);
|
||||
is_09 = 1;
|
||||
#if LWIP_HTTPD_SUPPORT_POST
|
||||
if (is_post) {
|
||||
@@ -2069,13 +1993,13 @@ http_parse_request(struct pbuf *inp, struct http_state *hs, struct tcp_pcb *pcb)
|
||||
uri_len = (u16_t)(sp2 - (sp1 + 1));
|
||||
if ((sp2 != 0) && (sp2 > sp1)) {
|
||||
/* wait for CRLFCRLF (indicating end of HTTP headers) before parsing anything */
|
||||
if (strnstr(data, CRLF CRLF, data_len) != NULL) {
|
||||
if (lwip_strnstr(data, CRLF CRLF, data_len) != NULL) {
|
||||
char *uri = sp1 + 1;
|
||||
#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
|
||||
/* This is HTTP/1.0 compatible: for strict 1.1, a connection
|
||||
would always be persistent unless "close" was specified. */
|
||||
if (!is_09 && (strnstr(data, HTTP11_CONNECTIONKEEPALIVE, data_len) ||
|
||||
strnstr(data, HTTP11_CONNECTIONKEEPALIVE2, data_len))) {
|
||||
if (!is_09 && (lwip_strnstr(data, HTTP11_CONNECTIONKEEPALIVE, data_len) ||
|
||||
lwip_strnstr(data, HTTP11_CONNECTIONKEEPALIVE2, data_len))) {
|
||||
hs->keepalive = 1;
|
||||
} else {
|
||||
hs->keepalive = 0;
|
||||
@@ -2259,7 +2183,7 @@ http_find_file(struct http_state *hs, const char *uri, int is_09)
|
||||
}
|
||||
tag_check = 0;
|
||||
for (loop = 0; loop < NUM_SHTML_EXTENSIONS; loop++) {
|
||||
if (!stricmp(ext, g_pcSSIExtensions[loop])) {
|
||||
if (!lwip_stricmp(ext, g_pcSSIExtensions[loop])) {
|
||||
tag_check = 1;
|
||||
break;
|
||||
}
|
||||
@@ -2334,7 +2258,7 @@ http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const cha
|
||||
if (is_09 && ((hs->handle->flags & FS_FILE_FLAGS_HEADER_INCLUDED) != 0)) {
|
||||
/* HTTP/0.9 responses are sent without HTTP header,
|
||||
search for the end of the header. */
|
||||
char *file_start = strnstr(hs->file, CRLF CRLF, hs->left);
|
||||
char *file_start = lwip_strnstr(hs->file, CRLF CRLF, hs->left);
|
||||
if (file_start != NULL) {
|
||||
size_t diff = file_start + 4 - hs->file;
|
||||
hs->file += diff;
|
||||
|
||||
Reference in New Issue
Block a user