1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
/* $Id: headers.c 9024 2010-03-21 16:49:30Z iulius $
**
** Routines for headers: manipulation and checks.
*/
#include "config.h"
#include "clibrary.h"
#include <ctype.h>
#include "inn/libinn.h"
/*
** We currently only check the requirements for RFC 3977:
**
** o The name [of a header] consists of one or more printable
** US-ASCII characters other than colon.
*/
bool
IsValidHeaderName(const char *string)
{
const unsigned char *p;
/* Not NULL. */
if (string == NULL)
return false;
p = (const unsigned char *) string;
/* Not empty. */
if (*p == '\0')
return false;
for (; *p != '\0'; p++) {
/* Contains only printable US-ASCII characters other
* than colon. */
if (!isgraph((unsigned char) *p) || *p == ':')
return false;
}
return true;
}
/*
** Skip any amount of CFWS (comments and folding whitespace), the RFC 5322
** grammar term for whitespace, CRLF pairs, and possibly nested comments that
** may contain escaped parens. We also allow simple newlines since we don't
** always deal with wire-format messages. Note that we do not attempt to
** ensure that CRLF or a newline is followed by whitespace. Returns the new
** position of the pointer.
*/
const char *
skip_cfws(const char *p)
{
int nesting = 0;
for (; *p != '\0'; p++) {
switch (*p) {
case ' ':
case '\t':
case '\n':
break;
case '\r':
if (p[1] != '\n' && nesting == 0)
return p;
break;
case '(':
nesting++;
break;
case ')':
if (nesting == 0)
return p;
nesting--;
break;
case '\\':
if (nesting == 0 || p[1] == '\0')
return p;
p++;
break;
default:
if (nesting == 0)
return p;
break;
}
}
return p;
}
/*
** Skip any amount of FWS (folding whitespace), the RFC 5322 grammar term
** for whitespace and CRLF pairs. We also allow simple newlines since we don't
** always deal with wire-format messages. Note that we do not attempt to
** ensure that CRLF or a newline is followed by whitespace. Returns the new
** position of the pointer.
*/
const char *
skip_fws(const char *p)
{
for (; *p != '\0'; p++) {
switch (*p) {
case ' ':
case '\t':
case '\n':
break;
case '\r':
if (p[1] != '\n')
return p;
break;
default:
return p;
}
}
return p;
}
|