aboutsummaryrefslogtreecommitdiffstats
path: root/lib/misc.c
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2011-12-19 01:00:31 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2011-12-19 01:00:31 +0100
commit9b0ad7e8334c7c01e8d9652aa3b1aaa6c5f6d211 (patch)
tree09908d626161e333ce64cd636b0aaede502ce85f /lib/misc.c
parent64b663524a465efb7707a2c634be97b9fb6f963b (diff)
Moving msn_findheader() to lib/misc.c as get_rfc822_header() so I can use it
in OAuth as well. (Need it to find the Content-Type: header.)
Diffstat (limited to 'lib/misc.c')
-rw-r--r--lib/misc.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/lib/misc.c b/lib/misc.c
index 711b927c..442f8f19 100644
--- a/lib/misc.c
+++ b/lib/misc.c
@@ -728,3 +728,55 @@ char **split_command_parts( char *command )
return cmd;
}
+
+char *get_rfc822_header( char *text, char *header, int len )
+{
+ int hlen = strlen( header ), i;
+ char *ret;
+
+ if( len == 0 )
+ len = strlen( text );
+
+ i = 0;
+ while( ( i + hlen ) < len )
+ {
+ /* Maybe this is a bit over-commented, but I just hate this part... */
+ if( g_strncasecmp( text + i, header, hlen ) == 0 )
+ {
+ /* Skip to the (probable) end of the header */
+ i += hlen;
+
+ /* Find the first non-[: \t] character */
+ while( i < len && ( text[i] == ':' || text[i] == ' ' || text[i] == '\t' ) ) i ++;
+
+ /* Make sure we're still inside the string */
+ if( i >= len ) return( NULL );
+
+ /* Save the position */
+ ret = text + i;
+
+ /* Search for the end of this line */
+ while( i < len && text[i] != '\r' && text[i] != '\n' ) i ++;
+
+ /* Make sure we're still inside the string */
+ if( i >= len ) return( NULL );
+
+ /* Copy the found data */
+ return( g_strndup( ret, text + i - ret ) );
+ }
+
+ /* This wasn't the header we were looking for, skip to the next line. */
+ while( i < len && ( text[i] != '\r' && text[i] != '\n' ) ) i ++;
+ while( i < len && ( text[i] == '\r' || text[i] == '\n' ) ) i ++;
+
+ /* End of headers? */
+ if( ( i >= 4 && strncmp( text + i - 4, "\r\n\r\n", 4 ) == 0 ) ||
+ ( i >= 2 && ( strncmp( text + i - 2, "\n\n", 2 ) == 0 ||
+ strncmp( text + i - 2, "\r\r", 2 ) == 0 ) ) )
+ {
+ break;
+ }
+ }
+
+ return( NULL );
+}