Buy commercial curl support from WolfSSL. We help you work
out your issues, debug your libcurl applications, use the API, port to new
platforms, add new features and more. With a team lead by the curl founder
himself.
Re: Fewer mallocs is better, episode #47
- Contemporary messages sorted: [ by date ] [ by thread ] [ by subject ] [ by author ] [ by messages with attachments ]
From: Cristian Rodríguez via curl-library <curl-library_at_lists.haxx.se>
Date: Fri, 4 Feb 2022 09:43:16 -0300
something like:
diff --git a/lib/http.c b/lib/http.c
index c036d877e..b62dec269 100644
--- a/lib/http.c
+++ b/lib/http.c
_at__at_ -1423,17 +1423,17 _at__at_ CURLcode Curl_buffer_send(struct dynbuf *in,
* Pass headers WITH the colon.
*/
bool
-Curl_compareheader(const char *headerline, /* line to check */
+Curl_compareheader_ex(const char *headerline, /* line to check */
const char *header, /* header keyword _with_ colon */
- const char *content) /* content string to find */
+ size_t hlen,
+ const char *content,
+ size_t clen) /* content string to find */
{
/* RFC2616, section 4.2 says: "Each header field consists of a name followed
* by a colon (":") and the field value. Field names are case-insensitive.
* The field value MAY be preceded by any amount of LWS, though a single SP
* is preferred." */
- size_t hlen = strlen(header);
- size_t clen;
size_t len;
const char *start;
const char *end;
_at__at_ -1456,11 +1456,10 @@ Curl_compareheader(const char *headerline, /*
line to check */
if(!end)
/* hm, there's no line ending here, use the zero byte! */
- end = strchr(start, '\0');
+ end = start + strlen(start);
}
len = end-start; /* length of the content part of the input line */
- clen = strlen(content); /* length of the word to find */
/* find the content string in the rest of the line */
for(; len >= clen; len--, start++) {
diff --git a/lib/http.h b/lib/http.h
index b4aaba2a2..da7409825 100644
--- a/lib/http.h
+++ b/lib/http.h
_at__at_ -44,10 +44,15 @@ extern const struct Curl_handler Curl_handler_http;
extern const struct Curl_handler Curl_handler_https;
#endif
+#define Curl_compareheader(headerline, header, content) \
+ Curl_compareheader_ex(headerline, header, strlen(header),
content, strlen(content))
+
/* Header specific functions */
-bool Curl_compareheader(const char *headerline, /* line to check */
+bool Curl_compareheader_ex(const char *headerline, /* line to check */
const char *header, /* header keyword _with_ colon */
- const char *content); /* content string to find */
+ size_t hlen, /* strlen of header */
+ const char *content, /* content string to find */
+ size_t clen); /* content string length */
char *Curl_copy_header_value(const char *header);
With optimization enabled will probably do what you want.
On Fri, Feb 4, 2022 at 8:00 AM Cristian Rodríguez
<crrodriguez_at_opensuse.org> wrote:
>
> On Thu, Feb 3, 2022 at 10:09 PM Henrik Holst via curl-library
> <curl-library_at_lists.haxx.se> wrote:
>
> > 23% of those for curl.se and 8% for google.com is due to Curl_compareheader, this looks like an internal only function and every single use inside curl is using string literals so we can replace them all with a compile time sizeof, if patches for this would be accepted then I would be happy to provide such.
>
> Well.. add a size_t header_len and content_len parameter to
> Curl_compareheader .. or provide an inline version of it, any compiler
> from the last decade will then do constant folding on strlen("test")
> when optimization is enabled.
Date: Fri, 4 Feb 2022 09:43:16 -0300
something like:
diff --git a/lib/http.c b/lib/http.c
index c036d877e..b62dec269 100644
--- a/lib/http.c
+++ b/lib/http.c
_at__at_ -1423,17 +1423,17 _at__at_ CURLcode Curl_buffer_send(struct dynbuf *in,
* Pass headers WITH the colon.
*/
bool
-Curl_compareheader(const char *headerline, /* line to check */
+Curl_compareheader_ex(const char *headerline, /* line to check */
const char *header, /* header keyword _with_ colon */
- const char *content) /* content string to find */
+ size_t hlen,
+ const char *content,
+ size_t clen) /* content string to find */
{
/* RFC2616, section 4.2 says: "Each header field consists of a name followed
* by a colon (":") and the field value. Field names are case-insensitive.
* The field value MAY be preceded by any amount of LWS, though a single SP
* is preferred." */
- size_t hlen = strlen(header);
- size_t clen;
size_t len;
const char *start;
const char *end;
_at__at_ -1456,11 +1456,10 @@ Curl_compareheader(const char *headerline, /*
line to check */
if(!end)
/* hm, there's no line ending here, use the zero byte! */
- end = strchr(start, '\0');
+ end = start + strlen(start);
}
len = end-start; /* length of the content part of the input line */
- clen = strlen(content); /* length of the word to find */
/* find the content string in the rest of the line */
for(; len >= clen; len--, start++) {
diff --git a/lib/http.h b/lib/http.h
index b4aaba2a2..da7409825 100644
--- a/lib/http.h
+++ b/lib/http.h
_at__at_ -44,10 +44,15 @@ extern const struct Curl_handler Curl_handler_http;
extern const struct Curl_handler Curl_handler_https;
#endif
+#define Curl_compareheader(headerline, header, content) \
+ Curl_compareheader_ex(headerline, header, strlen(header),
content, strlen(content))
+
/* Header specific functions */
-bool Curl_compareheader(const char *headerline, /* line to check */
+bool Curl_compareheader_ex(const char *headerline, /* line to check */
const char *header, /* header keyword _with_ colon */
- const char *content); /* content string to find */
+ size_t hlen, /* strlen of header */
+ const char *content, /* content string to find */
+ size_t clen); /* content string length */
char *Curl_copy_header_value(const char *header);
With optimization enabled will probably do what you want.
On Fri, Feb 4, 2022 at 8:00 AM Cristian Rodríguez
<crrodriguez_at_opensuse.org> wrote:
>
> On Thu, Feb 3, 2022 at 10:09 PM Henrik Holst via curl-library
> <curl-library_at_lists.haxx.se> wrote:
>
> > 23% of those for curl.se and 8% for google.com is due to Curl_compareheader, this looks like an internal only function and every single use inside curl is using string literals so we can replace them all with a compile time sizeof, if patches for this would be accepted then I would be happy to provide such.
>
> Well.. add a size_t header_len and content_len parameter to
> Curl_compareheader .. or provide an inline version of it, any compiler
> from the last decade will then do constant folding on strlen("test")
> when optimization is enabled.
-- Unsubscribe: https://lists.haxx.se/listinfo/curl-library Etiquette: https://curl.haxx.se/mail/etiquette.htmlReceived on 2022-02-04