|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* $LynxId: HTMIME.c,v 1.100 2018/03/11 21:32:38 tom Exp $
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* MIME Message Parse HTMIME.c
|
|
Packit |
f574b8 |
* ==================
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* This is RFC 1341-specific code.
|
|
Packit |
f574b8 |
* The input stream pushed into this parser is assumed to be
|
|
Packit |
f574b8 |
* stripped on CRs, ie lines end with LF, not CR LF.
|
|
Packit |
f574b8 |
* (It is easy to change this except for the body part where
|
|
Packit |
f574b8 |
* conversion can be slow.)
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* History:
|
|
Packit |
f574b8 |
* Feb 92 Written Tim Berners-Lee, CERN
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
#define HTSTREAM_INTERNAL 1
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
#include <HTUtils.h>
|
|
Packit |
f574b8 |
#include <HTMIME.h> /* Implemented here */
|
|
Packit |
f574b8 |
#include <HTTP.h> /* for redirecting_url */
|
|
Packit |
f574b8 |
#include <HTAlert.h>
|
|
Packit |
f574b8 |
#include <HTFile.h>
|
|
Packit |
f574b8 |
#include <HTCJK.h>
|
|
Packit |
f574b8 |
#include <UCMap.h>
|
|
Packit |
f574b8 |
#include <UCDefs.h>
|
|
Packit |
f574b8 |
#include <UCAux.h>
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
#include <LYCookie.h>
|
|
Packit |
f574b8 |
#include <LYCharSets.h>
|
|
Packit |
f574b8 |
#include <LYCharUtils.h>
|
|
Packit |
f574b8 |
#include <LYStrings.h>
|
|
Packit |
f574b8 |
#include <LYUtils.h>
|
|
Packit |
f574b8 |
#include <LYGlobalDefs.h>
|
|
Packit |
f574b8 |
#include <LYLeaks.h>
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* MIME Object
|
|
Packit |
f574b8 |
* -----------
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
typedef enum {
|
|
Packit |
f574b8 |
MIME_TRANSPARENT, /* put straight through to target ASAP! */
|
|
Packit |
f574b8 |
/* states for "Transfer-Encoding: chunked" */
|
|
Packit |
f574b8 |
MIME_CHUNKED,
|
|
Packit |
f574b8 |
mcCHUNKED_COUNT_DIGIT,
|
|
Packit |
f574b8 |
mcCHUNKED_COUNT_CR,
|
|
Packit |
f574b8 |
mcCHUNKED_COUNT_LF,
|
|
Packit |
f574b8 |
mcCHUNKED_EXTENSION,
|
|
Packit |
f574b8 |
mcCHUNKED_DATA,
|
|
Packit |
f574b8 |
mcCHUNKED_DATA_CR,
|
|
Packit |
f574b8 |
mcCHUNKED_DATA_LF,
|
|
Packit |
f574b8 |
/* character state-machine */
|
|
Packit |
f574b8 |
miBEGINNING_OF_LINE, /* first character and not a continuation */
|
|
Packit |
f574b8 |
miA,
|
|
Packit |
f574b8 |
miACCEPT_RANGES,
|
|
Packit |
f574b8 |
miAGE,
|
|
Packit |
f574b8 |
miAL,
|
|
Packit |
f574b8 |
miALLOW,
|
|
Packit |
f574b8 |
miALTERNATES,
|
|
Packit |
f574b8 |
miC,
|
|
Packit |
f574b8 |
miCACHE_CONTROL,
|
|
Packit |
f574b8 |
miCO,
|
|
Packit |
f574b8 |
miCOOKIE,
|
|
Packit |
f574b8 |
miCON,
|
|
Packit |
f574b8 |
miCONNECTION,
|
|
Packit |
f574b8 |
miCONTENT_,
|
|
Packit |
f574b8 |
miCONTENT_BASE,
|
|
Packit |
f574b8 |
miCONTENT_DISPOSITION,
|
|
Packit |
f574b8 |
miCONTENT_ENCODING,
|
|
Packit |
f574b8 |
miCONTENT_FEATURES,
|
|
Packit |
f574b8 |
miCONTENT_L,
|
|
Packit |
f574b8 |
miCONTENT_LANGUAGE,
|
|
Packit |
f574b8 |
miCONTENT_LENGTH,
|
|
Packit |
f574b8 |
miCONTENT_LOCATION,
|
|
Packit |
f574b8 |
miCONTENT_MD5,
|
|
Packit |
f574b8 |
miCONTENT_RANGE,
|
|
Packit |
f574b8 |
miCONTENT_T,
|
|
Packit |
f574b8 |
miCONTENT_TRANSFER_ENCODING,
|
|
Packit |
f574b8 |
miCONTENT_TYPE,
|
|
Packit |
f574b8 |
miDATE,
|
|
Packit |
f574b8 |
miE,
|
|
Packit |
f574b8 |
miETAG,
|
|
Packit |
f574b8 |
miEXPIRES,
|
|
Packit |
f574b8 |
miKEEP_ALIVE,
|
|
Packit |
f574b8 |
miL,
|
|
Packit |
f574b8 |
miLAST_MODIFIED,
|
|
Packit |
f574b8 |
miLINK,
|
|
Packit |
f574b8 |
miLOCATION,
|
|
Packit |
f574b8 |
miP,
|
|
Packit |
f574b8 |
miPR,
|
|
Packit |
f574b8 |
miPRAGMA,
|
|
Packit |
f574b8 |
miPROXY_AUTHENTICATE,
|
|
Packit |
f574b8 |
miPUBLIC,
|
|
Packit |
f574b8 |
miR,
|
|
Packit |
f574b8 |
miRE,
|
|
Packit |
f574b8 |
miREFRESH,
|
|
Packit |
f574b8 |
miRETRY_AFTER,
|
|
Packit |
f574b8 |
miS,
|
|
Packit |
f574b8 |
miSAFE,
|
|
Packit |
f574b8 |
miSE,
|
|
Packit |
f574b8 |
miSERVER,
|
|
Packit |
f574b8 |
miSET_COOKIE,
|
|
Packit |
f574b8 |
miSET_COOKIE1,
|
|
Packit |
f574b8 |
miSET_COOKIE2,
|
|
Packit |
f574b8 |
miT,
|
|
Packit |
f574b8 |
miTITLE,
|
|
Packit |
f574b8 |
miTRANSFER_ENCODING,
|
|
Packit |
f574b8 |
miU,
|
|
Packit |
f574b8 |
miUPGRADE,
|
|
Packit |
f574b8 |
miURI,
|
|
Packit |
f574b8 |
miV,
|
|
Packit |
f574b8 |
miVARY,
|
|
Packit |
f574b8 |
miVIA,
|
|
Packit |
f574b8 |
miW,
|
|
Packit |
f574b8 |
miWARNING,
|
|
Packit |
f574b8 |
miWWW_AUTHENTICATE,
|
|
Packit |
f574b8 |
miSKIP_GET_VALUE, /* Skip space then get value */
|
|
Packit |
f574b8 |
miGET_VALUE, /* Get value till white space */
|
|
Packit |
f574b8 |
miJUNK_LINE, /* Ignore the rest of this folded line */
|
|
Packit |
f574b8 |
miNEWLINE, /* Just found a LF .. maybe continuation */
|
|
Packit |
f574b8 |
miCHECK, /* check against check_pointer */
|
|
Packit |
f574b8 |
MIME_NET_ASCII, /* Translate from net ascii */
|
|
Packit |
f574b8 |
MIME_IGNORE /* Ignore entire file */
|
|
Packit |
f574b8 |
/* TRANSPARENT and IGNORE are defined as stg else in _WINDOWS */
|
|
Packit |
f574b8 |
} MIME_state;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
#define VALUE_SIZE 5120 /* @@@@@@@ Arbitrary? */
|
|
Packit |
f574b8 |
struct _HTStream {
|
|
Packit |
f574b8 |
const HTStreamClass *isa;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
BOOL net_ascii; /* Is input net ascii? */
|
|
Packit |
f574b8 |
MIME_state state; /* current state */
|
|
Packit |
f574b8 |
MIME_state if_ok; /* got this state if match */
|
|
Packit |
f574b8 |
MIME_state field; /* remember which field */
|
|
Packit |
f574b8 |
MIME_state fold_state; /* state on a fold */
|
|
Packit |
f574b8 |
BOOL head_only; /* only parsing header */
|
|
Packit |
f574b8 |
BOOL pickup_redirection; /* parsing for location */
|
|
Packit |
f574b8 |
BOOL no_streamstack; /* use sink directly */
|
|
Packit |
f574b8 |
const char *check_pointer; /* checking input */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
char *value_pointer; /* storing values */
|
|
Packit |
f574b8 |
char value[VALUE_SIZE];
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
HTParentAnchor *anchor; /* Given on creation */
|
|
Packit |
f574b8 |
HTStream *sink; /* Given on creation */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
char *boundary; /* For multipart */
|
|
Packit |
f574b8 |
char *set_cookie; /* Set-Cookie */
|
|
Packit |
f574b8 |
char *set_cookie2; /* Set-Cookie2 */
|
|
Packit |
f574b8 |
char *location; /* Location */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
char *refresh_url; /* "Refresh:" URL */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
HTFormat c_t_encoding; /* Content-Transfer-Encoding */
|
|
Packit |
f574b8 |
char *compression_encoding;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
BOOL chunked_encoding; /* Transfer-Encoding: chunked */
|
|
Packit |
f574b8 |
long chunked_size; /* ...counter for "chunked" */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
HTFormat format; /* Content-Type */
|
|
Packit |
f574b8 |
HTStream *target; /* While writing out */
|
|
Packit |
f574b8 |
HTStreamClass targetClass;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
HTAtom *targetRep; /* Converting into? */
|
|
Packit |
f574b8 |
};
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* This function is for trimming off any paired
|
|
Packit |
f574b8 |
* open- and close-double quotes from header values.
|
|
Packit |
f574b8 |
* It does not parse the string for embedded quotes,
|
|
Packit |
f574b8 |
* and will not modify the string unless both the
|
|
Packit |
f574b8 |
* first and last characters are double-quotes. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
void HTMIME_TrimDoubleQuotes(char *value)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
size_t i;
|
|
Packit |
f574b8 |
char *cp = value;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (isEmpty(cp) || *cp != '"')
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
i = strlen(cp);
|
|
Packit |
f574b8 |
if (cp[(i - 1)] != '"')
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
else
|
|
Packit |
f574b8 |
cp[(i - 1)] = '\0';
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
for (i = 0; value[i]; i++)
|
|
Packit |
f574b8 |
value[i] = cp[(i + 1)];
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Check if the token from "Content-Encoding" corresponds to a compression
|
|
Packit |
f574b8 |
* type.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
static BOOL content_is_compressed(HTStream *me)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
char *encoding = me->anchor->content_encoding;
|
|
Packit |
f574b8 |
BOOL result = (BOOL) (HTEncodingToCompressType(encoding) != cftNone);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
CTRACE((tfp, "content is%s compressed\n", result ? "" : " NOT"));
|
|
Packit |
f574b8 |
return result;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Strip quotes from a refresh-URL.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
static void dequote(char *url)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
size_t len;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
len = strlen(url);
|
|
Packit |
f574b8 |
if (*url == '\'' && len > 1 && url[len - 1] == url[0]) {
|
|
Packit |
f574b8 |
url[len - 1] = '\0';
|
|
Packit |
f574b8 |
while ((url[0] = url[1]) != '\0') {
|
|
Packit |
f574b8 |
++url;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Strip off any compression-suffix from the address and check if the result
|
|
Packit |
f574b8 |
* looks like one of the presentable suffixes. If so, return the corresponding
|
|
Packit |
f574b8 |
* MIME type.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
static const char *UncompressedContentType(HTStream *me, CompressFileType method)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
const char *result = 0;
|
|
Packit |
f574b8 |
char *address = me->anchor->address;
|
|
Packit |
f574b8 |
const char *expected = HTCompressTypeToSuffix(method);
|
|
Packit |
f574b8 |
const char *actual = strrchr(address, '.');
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* We have to ensure the suffix is consistent, to use HTFileFormat().
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
if (actual != 0 && !strcasecomp(actual, expected)) {
|
|
Packit |
f574b8 |
HTFormat format;
|
|
Packit |
f574b8 |
HTAtom *pencoding = 0;
|
|
Packit |
f574b8 |
const char *description = 0;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
format = HTFileFormat(address, &pencoding, &description);
|
|
Packit |
f574b8 |
result = HTAtom_name(format);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
return result;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
static int pumpData(HTStream *me)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
CompressFileType method;
|
|
Packit |
f574b8 |
const char *new_encoding;
|
|
Packit |
f574b8 |
const char *new_content;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
CTRACE((tfp, "Begin pumpData\n"));
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* If the content-type says it is compressed, and there is no
|
|
Packit |
f574b8 |
* content-encoding, check further and see if the address (omitting the
|
|
Packit |
f574b8 |
* suffix for a compressed type) looks like a type we can present. If so,
|
|
Packit |
f574b8 |
* rearrange things so we'll present the StreamStack code with the
|
|
Packit |
f574b8 |
* presentable type, already marked as compressed.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
CTRACE((tfp, "...address{%s}\n", me->anchor->address));
|
|
Packit |
f574b8 |
method = HTContentTypeToCompressType(me->anchor->content_type_params);
|
|
Packit |
f574b8 |
if (isEmpty(me->anchor->content_encoding))
|
|
Packit |
f574b8 |
me->anchor->no_content_encoding = TRUE;
|
|
Packit |
f574b8 |
if ((method != cftNone)
|
|
Packit |
f574b8 |
&& isEmpty(me->anchor->content_encoding)
|
|
Packit |
f574b8 |
&& (new_content = UncompressedContentType(me, method)) != 0) {
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
new_encoding = HTCompressTypeToEncoding(method);
|
|
Packit |
f574b8 |
CTRACE((tfp, "reinterpreting as content-type:%s, encoding:%s\n",
|
|
Packit |
f574b8 |
new_content, new_encoding));
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->content_encoding, new_encoding);
|
|
Packit |
f574b8 |
FREE(me->compression_encoding);
|
|
Packit |
f574b8 |
StrAllocCopy(me->compression_encoding, new_encoding);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
LYStrNCpy(me->value, new_content, VALUE_SIZE - 1);
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->content_type_params, me->value);
|
|
Packit |
f574b8 |
me->format = HTAtom_for(me->value);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (StrChr(HTAtom_name(me->format), ';') != NULL) {
|
|
Packit |
f574b8 |
char *cp = NULL, *cp1, *cp2, *cp3 = NULL, *cp4;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Extended MIME Content-Type is %s\n",
|
|
Packit |
f574b8 |
HTAtom_name(me->format)));
|
|
Packit |
f574b8 |
StrAllocCopy(cp, HTAtom_name(me->format));
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Note that the Content-Type value was converted
|
|
Packit |
f574b8 |
* to lower case when we loaded into me->format,
|
|
Packit |
f574b8 |
* but there may have been a mixed or upper-case
|
|
Packit |
f574b8 |
* atom, so we'll force lower-casing again. We
|
|
Packit |
f574b8 |
* also stripped spaces and double-quotes, but
|
|
Packit |
f574b8 |
* we'll make sure they're still gone from any
|
|
Packit |
f574b8 |
* charset parameter we check. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
LYLowerCase(cp);
|
|
Packit |
f574b8 |
if ((cp1 = StrChr(cp, ';')) != NULL) {
|
|
Packit |
f574b8 |
BOOL chartrans_ok = NO;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if ((cp2 = strstr(cp1, "charset")) != NULL) {
|
|
Packit |
f574b8 |
int chndl;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
cp2 += 7;
|
|
Packit |
f574b8 |
while (*cp2 == ' ' || *cp2 == '=' || *cp2 == '"')
|
|
Packit |
f574b8 |
cp2++;
|
|
Packit |
f574b8 |
StrAllocCopy(cp3, cp2); /* copy to mutilate more */
|
|
Packit |
f574b8 |
for (cp4 = cp3; (*cp4 != '\0' && *cp4 != '"' &&
|
|
Packit |
f574b8 |
*cp4 != ';' && *cp4 != ':' &&
|
|
Packit |
f574b8 |
!WHITE(*cp4)); cp4++) ; /* do nothing */
|
|
Packit |
f574b8 |
*cp4 = '\0';
|
|
Packit |
f574b8 |
cp4 = cp3;
|
|
Packit |
f574b8 |
chndl = UCGetLYhndl_byMIME(cp3);
|
|
Packit |
f574b8 |
if (UCCanTranslateFromTo(chndl,
|
|
Packit |
f574b8 |
current_char_set)) {
|
|
Packit |
f574b8 |
chartrans_ok = YES;
|
|
Packit |
f574b8 |
*cp1 = '\0';
|
|
Packit |
f574b8 |
me->format = HTAtom_for(cp);
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->charset, cp4);
|
|
Packit |
f574b8 |
HTAnchor_setUCInfoStage(me->anchor, chndl,
|
|
Packit |
f574b8 |
UCT_STAGE_MIME,
|
|
Packit |
f574b8 |
UCT_SETBY_MIME);
|
|
Packit |
f574b8 |
} else if (chndl < 0) { /* got something but we don't
|
|
Packit |
f574b8 |
recognize it */
|
|
Packit |
f574b8 |
chndl = UCLYhndl_for_unrec;
|
|
Packit |
f574b8 |
if (chndl < 0)
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* UCLYhndl_for_unrec not defined :-( fallback to
|
|
Packit |
f574b8 |
* UCLYhndl_for_unspec which always valid.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
chndl = UCLYhndl_for_unspec; /* always >= 0 */
|
|
Packit |
f574b8 |
if (UCCanTranslateFromTo(chndl,
|
|
Packit |
f574b8 |
current_char_set)) {
|
|
Packit |
f574b8 |
chartrans_ok = YES;
|
|
Packit |
f574b8 |
*cp1 = '\0';
|
|
Packit |
f574b8 |
me->format = HTAtom_for(cp);
|
|
Packit |
f574b8 |
HTAnchor_setUCInfoStage(me->anchor, chndl,
|
|
Packit |
f574b8 |
UCT_STAGE_MIME,
|
|
Packit |
f574b8 |
UCT_SETBY_DEFAULT);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Something like 'big5' - we cannot translate it, but
|
|
Packit |
f574b8 |
* the user may still be able to navigate the links.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
*cp1 = '\0';
|
|
Packit |
f574b8 |
me->format = HTAtom_for(cp);
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->charset, cp4);
|
|
Packit |
f574b8 |
HTAnchor_setUCInfoStage(me->anchor, chndl,
|
|
Packit |
f574b8 |
UCT_STAGE_MIME,
|
|
Packit |
f574b8 |
UCT_SETBY_MIME);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (chartrans_ok) {
|
|
Packit |
f574b8 |
LYUCcharset *p_in =
|
|
Packit |
f574b8 |
HTAnchor_getUCInfoStage(me->anchor,
|
|
Packit |
f574b8 |
UCT_STAGE_MIME);
|
|
Packit |
f574b8 |
LYUCcharset *p_out =
|
|
Packit |
f574b8 |
HTAnchor_setUCInfoStage(me->anchor,
|
|
Packit |
f574b8 |
current_char_set,
|
|
Packit |
f574b8 |
UCT_STAGE_HTEXT,
|
|
Packit |
f574b8 |
UCT_SETBY_DEFAULT);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (!p_out)
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Try again.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
p_out =
|
|
Packit |
f574b8 |
HTAnchor_getUCInfoStage(me->anchor,
|
|
Packit |
f574b8 |
UCT_STAGE_HTEXT);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (!strcmp(p_in->MIMEname,
|
|
Packit |
f574b8 |
"x-transparent")) {
|
|
Packit |
f574b8 |
HTPassEightBitRaw = TRUE;
|
|
Packit |
f574b8 |
HTAnchor_setUCInfoStage(me->anchor,
|
|
Packit |
f574b8 |
HTAnchor_getUCLYhndl(me->anchor,
|
|
Packit |
f574b8 |
UCT_STAGE_HTEXT),
|
|
Packit |
f574b8 |
UCT_STAGE_MIME,
|
|
Packit |
f574b8 |
UCT_SETBY_DEFAULT);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (!strcmp(p_out->MIMEname,
|
|
Packit |
f574b8 |
"x-transparent")) {
|
|
Packit |
f574b8 |
HTPassEightBitRaw = TRUE;
|
|
Packit |
f574b8 |
HTAnchor_setUCInfoStage(me->anchor,
|
|
Packit |
f574b8 |
HTAnchor_getUCLYhndl(me->anchor,
|
|
Packit |
f574b8 |
UCT_STAGE_MIME),
|
|
Packit |
f574b8 |
UCT_STAGE_HTEXT,
|
|
Packit |
f574b8 |
UCT_SETBY_DEFAULT);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if ((p_in->enc != UCT_ENC_CJK)
|
|
Packit |
f574b8 |
#ifdef EXP_JAPANESEUTF8_SUPPORT
|
|
Packit |
f574b8 |
&& ((p_in->enc != UCT_ENC_UTF8)
|
|
Packit |
f574b8 |
|| (p_out->enc != UCT_ENC_CJK))
|
|
Packit |
f574b8 |
#endif
|
|
Packit |
f574b8 |
) {
|
|
Packit |
f574b8 |
HTCJK = NOCJK;
|
|
Packit |
f574b8 |
if (!(p_in->codepoints &
|
|
Packit |
f574b8 |
UCT_CP_SUBSETOF_LAT1) &&
|
|
Packit |
f574b8 |
chndl == current_char_set) {
|
|
Packit |
f574b8 |
HTPassEightBitRaw = TRUE;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
} else if (p_out->enc == UCT_ENC_CJK) {
|
|
Packit |
f574b8 |
Set_HTCJK(p_in->MIMEname, p_out->MIMEname);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Cannot translate. If according to some heuristic the
|
|
Packit |
f574b8 |
* given charset and the current display character both are
|
|
Packit |
f574b8 |
* likely to be like ISO-8859 in structure, pretend we have
|
|
Packit |
f574b8 |
* some kind of match.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
BOOL given_is_8859 =
|
|
Packit |
f574b8 |
(BOOL) (!StrNCmp(cp4, "iso-8859-", 9) &&
|
|
Packit |
f574b8 |
isdigit(UCH(cp4[9])));
|
|
Packit |
f574b8 |
BOOL given_is_8859like =
|
|
Packit |
f574b8 |
(BOOL) (given_is_8859 ||
|
|
Packit |
f574b8 |
!StrNCmp(cp4, "windows-", 8) ||
|
|
Packit |
f574b8 |
!StrNCmp(cp4, "cp12", 4) ||
|
|
Packit |
f574b8 |
!StrNCmp(cp4, "cp-12", 5));
|
|
Packit |
f574b8 |
BOOL given_and_display_8859like =
|
|
Packit |
f574b8 |
(BOOL) (given_is_8859like &&
|
|
Packit |
f574b8 |
(strstr(LYchar_set_names[current_char_set],
|
|
Packit |
f574b8 |
"ISO-8859") ||
|
|
Packit |
f574b8 |
strstr(LYchar_set_names[current_char_set],
|
|
Packit |
f574b8 |
"windows-")));
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (given_and_display_8859like) {
|
|
Packit |
f574b8 |
*cp1 = '\0';
|
|
Packit |
f574b8 |
me->format = HTAtom_for(cp);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (given_is_8859) {
|
|
Packit |
f574b8 |
cp1 = &cp4[10];
|
|
Packit |
f574b8 |
while (*cp1 &&
|
|
Packit |
f574b8 |
isdigit(UCH(*cp1)))
|
|
Packit |
f574b8 |
cp1++;
|
|
Packit |
f574b8 |
*cp1 = '\0';
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (given_and_display_8859like) {
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->charset, cp4);
|
|
Packit |
f574b8 |
HTPassEightBitRaw = TRUE;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
HTAlert(*cp4 ? cp4 : me->anchor->charset);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
FREE(cp3);
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* No charset parameter is present. Ignore all other
|
|
Packit |
f574b8 |
* parameters, as we do when charset is present. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
*cp1 = '\0';
|
|
Packit |
f574b8 |
me->format = HTAtom_for(cp);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
FREE(cp);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* If we have an Expires header and haven't already set the no_cache
|
|
Packit |
f574b8 |
* element for the anchor, check if we should set it based on that header.
|
|
Packit |
f574b8 |
* - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
if (me->anchor->no_cache == FALSE &&
|
|
Packit |
f574b8 |
me->anchor->expires != NULL) {
|
|
Packit |
f574b8 |
if (!strcmp(me->anchor->expires, "0")) {
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* The value is zero, which we treat as an absolute no-cache
|
|
Packit |
f574b8 |
* directive. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
me->anchor->no_cache = TRUE;
|
|
Packit |
f574b8 |
} else if (me->anchor->date != NULL) {
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* We have a Date header, so check if the value is less than or
|
|
Packit |
f574b8 |
* equal to that. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
if (LYmktime(me->anchor->expires, TRUE) <=
|
|
Packit |
f574b8 |
LYmktime(me->anchor->date, TRUE)) {
|
|
Packit |
f574b8 |
me->anchor->no_cache = TRUE;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
} else if (LYmktime(me->anchor->expires, FALSE) == 0) {
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* We don't have a Date header, and the value is in past for us. -
|
|
Packit |
f574b8 |
* FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
me->anchor->no_cache = TRUE;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->content_type,
|
|
Packit |
f574b8 |
HTAtom_name(me->format));
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (me->set_cookie != NULL || me->set_cookie2 != NULL) {
|
|
Packit |
f574b8 |
LYSetCookie(me->set_cookie,
|
|
Packit |
f574b8 |
me->set_cookie2,
|
|
Packit |
f574b8 |
me->anchor->address);
|
|
Packit |
f574b8 |
FREE(me->set_cookie);
|
|
Packit |
f574b8 |
FREE(me->set_cookie2);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (me->pickup_redirection) {
|
|
Packit |
f574b8 |
if (me->location && *me->location) {
|
|
Packit |
f574b8 |
redirecting_url = me->location;
|
|
Packit |
f574b8 |
me->location = NULL;
|
|
Packit |
f574b8 |
if (me->targetRep != WWW_DEBUG || me->sink)
|
|
Packit |
f574b8 |
me->head_only = YES;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
permanent_redirection = FALSE;
|
|
Packit |
f574b8 |
if (me->location) {
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTTP: 'Location:' is zero-length!\n"));
|
|
Packit |
f574b8 |
HTAlert(REDIRECTION_WITH_BAD_LOCATION);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTTP: Failed to pick up location.\n"));
|
|
Packit |
f574b8 |
if (me->location) {
|
|
Packit |
f574b8 |
FREE(me->location);
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
HTAlert(REDIRECTION_WITH_NO_LOCATION);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
CTRACE((tfp, "...pumpData finished reading header\n"));
|
|
Packit |
f574b8 |
if (me->head_only) {
|
|
Packit |
f574b8 |
/* We are done! - kw */
|
|
Packit |
f574b8 |
me->state = MIME_IGNORE;
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (me->no_streamstack) {
|
|
Packit |
f574b8 |
me->target = me->sink;
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
if (!me->compression_encoding) {
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: MIME Content-Type is '%s', converting to '%s'\n",
|
|
Packit |
f574b8 |
HTAtom_name(me->format), HTAtom_name(me->targetRep)));
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Change the format to that for "www/compressed" and set up a
|
|
Packit |
f574b8 |
* stream to deal with it. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: MIME Content-Type is '%s',\n",
|
|
Packit |
f574b8 |
HTAtom_name(me->format)));
|
|
Packit |
f574b8 |
me->format = HTAtom_for("www/compressed");
|
|
Packit |
f574b8 |
CTRACE((tfp, " Treating as '%s'. Converting to '%s'\n",
|
|
Packit |
f574b8 |
HTAtom_name(me->format), HTAtom_name(me->targetRep)));
|
|
Packit |
f574b8 |
FREE(me->compression_encoding);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
me->target = HTStreamStack(me->format, me->targetRep,
|
|
Packit |
f574b8 |
me->sink, me->anchor);
|
|
Packit |
f574b8 |
if (!me->target) {
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Can't translate! ** \n"));
|
|
Packit |
f574b8 |
me->target = me->sink; /* Cheat */
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (me->target) {
|
|
Packit |
f574b8 |
me->targetClass = *me->target->isa;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Pump rest of data right through, according to the transfer encoding.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
me->state = (me->chunked_encoding
|
|
Packit |
f574b8 |
? MIME_CHUNKED
|
|
Packit |
f574b8 |
: MIME_TRANSPARENT);
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
me->state = MIME_IGNORE; /* What else to do? */
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (me->refresh_url != NULL && !content_is_compressed(me)) {
|
|
Packit |
f574b8 |
char *url = NULL;
|
|
Packit |
f574b8 |
char *num = NULL;
|
|
Packit |
f574b8 |
char *txt = NULL;
|
|
Packit |
f574b8 |
const char *base = ""; /* FIXME: refresh_url may be relative to doc */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
LYParseRefreshURL(me->refresh_url, &num, &url;;
|
|
Packit |
f574b8 |
if (url != NULL && me->format == WWW_HTML) {
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"Formatting refresh-url as first line of result\n"));
|
|
Packit |
f574b8 |
HTSprintf0(&txt, gettext("Refresh: "));
|
|
Packit |
f574b8 |
HTSprintf(&txt, gettext("%s seconds "), num);
|
|
Packit |
f574b8 |
dequote(url);
|
|
Packit |
f574b8 |
HTSprintf(&txt, "%s ", base, url, url);
|
|
Packit |
f574b8 |
CTRACE((tfp, "URL %s%s\n", base, url));
|
|
Packit |
f574b8 |
(me->isa->put_string) (me, txt);
|
|
Packit |
f574b8 |
free(txt);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
FREE(num);
|
|
Packit |
f574b8 |
FREE(url);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
CTRACE((tfp, "...end of pumpData, copied %"
|
|
Packit |
f574b8 |
PRI_off_t " vs %"
|
|
Packit |
f574b8 |
PRI_off_t "\n",
|
|
Packit |
f574b8 |
CAST_off_t (me->anchor->actual_length),
|
|
Packit |
f574b8 |
CAST_off_t (me->anchor->content_length)));
|
|
Packit |
f574b8 |
me->anchor->actual_length = 0;
|
|
Packit |
f574b8 |
return HT_OK;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
static int dispatchField(HTStream *me)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
int i, j;
|
|
Packit |
f574b8 |
char *cp;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
*me->value_pointer = '\0';
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
cp = me->value_pointer;
|
|
Packit |
f574b8 |
while ((cp > me->value) && *(--cp) == ' ') /* S/390 -- gil -- 0146 */
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Trim trailing spaces.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
*cp = '\0';
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
switch (me->field) {
|
|
Packit |
f574b8 |
case miACCEPT_RANGES:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Accept-Ranges: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miAGE:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Age: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miALLOW:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Allow: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miALTERNATES:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Alternates: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miCACHE_CONTROL:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Cache-Control: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Convert to lowercase and indicate in anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
LYLowerCase(me->value);
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->cache_control, me->value);
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Check whether to set no_cache for the anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
char *cp1, *cp0 = me->value;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
while ((cp1 = strstr(cp0, "no-cache")) != NULL) {
|
|
Packit |
f574b8 |
cp1 += 8;
|
|
Packit |
f574b8 |
while (*cp1 != '\0' && WHITE(*cp1))
|
|
Packit |
f574b8 |
cp1++;
|
|
Packit |
f574b8 |
if (*cp1 == '\0' || *cp1 == ';') {
|
|
Packit |
f574b8 |
me->anchor->no_cache = TRUE;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
cp0 = cp1;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (me->anchor->no_cache == TRUE)
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
cp0 = me->value;
|
|
Packit |
f574b8 |
while ((cp1 = strstr(cp0, "max-age")) != NULL) {
|
|
Packit |
f574b8 |
cp1 += 7;
|
|
Packit |
f574b8 |
while (*cp1 != '\0' && WHITE(*cp1))
|
|
Packit |
f574b8 |
cp1++;
|
|
Packit |
f574b8 |
if (*cp1 == '=') {
|
|
Packit |
f574b8 |
cp1++;
|
|
Packit |
f574b8 |
while (*cp1 != '\0' && WHITE(*cp1))
|
|
Packit |
f574b8 |
cp1++;
|
|
Packit |
f574b8 |
if (isdigit(UCH(*cp1))) {
|
|
Packit |
f574b8 |
cp0 = cp1;
|
|
Packit |
f574b8 |
while (isdigit(UCH(*cp1)))
|
|
Packit |
f574b8 |
cp1++;
|
|
Packit |
f574b8 |
if (*cp0 == '0' && cp1 == (cp0 + 1)) {
|
|
Packit |
f574b8 |
me->anchor->no_cache = TRUE;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
cp0 = cp1;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miCOOKIE:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Cookie: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miCONNECTION:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Connection: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miCONTENT_BASE:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Content-Base: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Indicate in anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->content_base, me->value);
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miCONTENT_DISPOSITION:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Content-Disposition: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Indicate in anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->content_disposition, me->value);
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* It's not clear yet from existing RFCs and IDs whether we should be
|
|
Packit |
f574b8 |
* looking for file;, attachment;, and/or inline; before the
|
|
Packit |
f574b8 |
* filename=value, so we'll just search for "filename" followed by '='
|
|
Packit |
f574b8 |
* and just hope we get the intended value. It is purely a suggested
|
|
Packit |
f574b8 |
* name, anyway. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
cp = me->anchor->content_disposition;
|
|
Packit |
f574b8 |
while (*cp != '\0' && strncasecomp(cp, "filename", 8))
|
|
Packit |
f574b8 |
cp++;
|
|
Packit |
f574b8 |
if (*cp == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
cp += 8;
|
|
Packit |
f574b8 |
while ((*cp != '\0') && (WHITE(*cp) || *cp == '='))
|
|
Packit |
f574b8 |
cp++;
|
|
Packit |
f574b8 |
if (*cp == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
while (*cp != '\0' && WHITE(*cp))
|
|
Packit |
f574b8 |
cp++;
|
|
Packit |
f574b8 |
if (*cp == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->SugFname, cp);
|
|
Packit |
f574b8 |
if (*me->anchor->SugFname == '"') {
|
|
Packit |
f574b8 |
if ((cp = StrChr((me->anchor->SugFname + 1),
|
|
Packit |
f574b8 |
'"')) != NULL) {
|
|
Packit |
f574b8 |
*(cp + 1) = '\0';
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->anchor->SugFname);
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
FREE(me->anchor->SugFname);
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
cp = me->anchor->SugFname;
|
|
Packit |
f574b8 |
while (*cp != '\0' && !WHITE(*cp))
|
|
Packit |
f574b8 |
cp++;
|
|
Packit |
f574b8 |
*cp = '\0';
|
|
Packit |
f574b8 |
if (*me->anchor->SugFname == '\0')
|
|
Packit |
f574b8 |
FREE(me->anchor->SugFname);
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miCONTENT_ENCODING:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Content-Encoding: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0' ||
|
|
Packit |
f574b8 |
!strcasecomp(me->value, "identity"))
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Convert to lowercase and indicate in anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
LYLowerCase(me->value);
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->content_encoding, me->value);
|
|
Packit |
f574b8 |
FREE(me->compression_encoding);
|
|
Packit |
f574b8 |
if (content_is_compressed(me)) {
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Save it to use as a flag for setting up a "www/compressed"
|
|
Packit |
f574b8 |
* target. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
StrAllocCopy(me->compression_encoding, me->value);
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Some server indicated "8bit", "7bit" or "binary"
|
|
Packit |
f574b8 |
* inappropriately. We'll ignore it. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
CTRACE((tfp, " Ignoring it!\n"));
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miCONTENT_FEATURES:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Content-Features: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miCONTENT_LANGUAGE:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Content-Language: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Convert to lowercase and indicate in anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
LYLowerCase(me->value);
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->content_language, me->value);
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miCONTENT_LENGTH:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Content-Length: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Convert to integer and indicate in anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
me->anchor->content_length = LYatoll(me->value);
|
|
Packit |
f574b8 |
if (me->anchor->content_length < 0)
|
|
Packit |
f574b8 |
me->anchor->content_length = 0;
|
|
Packit |
f574b8 |
CTRACE((tfp, " Converted to integer: '%" PRI_off_t "'\n",
|
|
Packit |
f574b8 |
CAST_off_t (me->anchor->content_length)));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miCONTENT_LOCATION:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Content-Location: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Indicate in anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->content_location, me->value);
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miCONTENT_MD5:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Content-MD5: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Indicate in anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->content_md5, me->value);
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miCONTENT_RANGE:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Content-Range: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miCONTENT_TRANSFER_ENCODING:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Content-Transfer-Encoding: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Force the Content-Transfer-Encoding value to all lower case. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
LYLowerCase(me->value);
|
|
Packit |
f574b8 |
me->c_t_encoding = HTAtom_for(me->value);
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miCONTENT_TYPE:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Content-Type: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Force the Content-Type value to all lower case and strip spaces and
|
|
Packit |
f574b8 |
* double-quotes. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
for (i = 0, j = 0; me->value[i]; i++) {
|
|
Packit |
f574b8 |
if (me->value[i] != ' ' && me->value[i] != '"') {
|
|
Packit |
f574b8 |
me->value[j++] = (char) TOLOWER(me->value[i]);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
me->value[j] = '\0';
|
|
Packit |
f574b8 |
me->format = HTAtom_for(me->value);
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->content_type_params, me->value);
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miDATE:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Date: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Indicate in anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->date, me->value);
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miETAG:
|
|
Packit |
f574b8 |
/* Do not trim double quotes: an entity tag consists of an opaque
|
|
Packit |
f574b8 |
* quoted string, possibly prefixed by a weakness indicator.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP ETag: %s\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Indicate in anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->ETag, me->value);
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miEXPIRES:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Expires: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Indicate in anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->expires, me->value);
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miKEEP_ALIVE:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Keep-Alive: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miLAST_MODIFIED:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Last-Modified: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Indicate in anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->last_modified, me->value);
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miLINK:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Link: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miLOCATION:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Location: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->pickup_redirection && !me->location) {
|
|
Packit |
f574b8 |
StrAllocCopy(me->location, me->value);
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: *** Ignoring Location!\n"));
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miPRAGMA:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Pragma: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Check whether to set no_cache for the anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
if (!strcmp(me->value, "no-cache"))
|
|
Packit |
f574b8 |
me->anchor->no_cache = TRUE;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miPROXY_AUTHENTICATE:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Proxy-Authenticate: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miPUBLIC:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Public: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miREFRESH: /* nonstandard: Netscape */
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Refresh: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
StrAllocCopy(me->refresh_url, me->value);
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miRETRY_AFTER:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Retry-After: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miSAFE:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Safe: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Indicate in anchor if "YES" or "TRUE". - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
if (!strcasecomp(me->value, "YES") ||
|
|
Packit |
f574b8 |
!strcasecomp(me->value, "TRUE")) {
|
|
Packit |
f574b8 |
me->anchor->safe = TRUE;
|
|
Packit |
f574b8 |
} else if (!strcasecomp(me->value, "NO") ||
|
|
Packit |
f574b8 |
!strcasecomp(me->value, "FALSE")) {
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* If server explicitly tells us that it has changed its mind,
|
|
Packit |
f574b8 |
* reset flag in anchor. - kw
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
me->anchor->safe = FALSE;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miSERVER:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Server: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->value[0] == '\0')
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Indicate in anchor. - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
StrAllocCopy(me->anchor->server, me->value);
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miSET_COOKIE1:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Set-Cookie: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->set_cookie == NULL) {
|
|
Packit |
f574b8 |
StrAllocCopy(me->set_cookie, me->value);
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
StrAllocCat(me->set_cookie, ", ");
|
|
Packit |
f574b8 |
StrAllocCat(me->set_cookie, me->value);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miSET_COOKIE2:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Set-Cookie2: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (me->set_cookie2 == NULL) {
|
|
Packit |
f574b8 |
StrAllocCopy(me->set_cookie2, me->value);
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
StrAllocCat(me->set_cookie2, ", ");
|
|
Packit |
f574b8 |
StrAllocCat(me->set_cookie2, me->value);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miTITLE:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Title: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miTRANSFER_ENCODING:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Transfer-Encoding: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
if (!strcmp(me->value, "chunked"))
|
|
Packit |
f574b8 |
me->chunked_encoding = YES;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miUPGRADE:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Upgrade: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miURI:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP URI: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miVARY:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Vary: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miVIA:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Via: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miWARNING:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP Warning: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case miWWW_AUTHENTICATE:
|
|
Packit |
f574b8 |
HTMIME_TrimDoubleQuotes(me->value);
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: PICKED UP WWW-Authenticate: '%s'\n",
|
|
Packit |
f574b8 |
me->value));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
default: /* Should never get here */
|
|
Packit |
f574b8 |
return HT_ERROR;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
return HT_OK;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*_________________________________________________________________________
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* A C T I O N R O U T I N E S
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* Character handling
|
|
Packit |
f574b8 |
* ------------------
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* This is a FSM parser. It ignores field names it does not understand.
|
|
Packit |
f574b8 |
* Folded header fields are recognized. Lines without a fieldname at
|
|
Packit |
f574b8 |
* the beginning (that are not folded continuation lines) are ignored
|
|
Packit |
f574b8 |
* as unknown field names. Fields with empty values are not picked up.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
static void HTMIME_put_character(HTStream *me, int c)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
if (me->anchor->inHEAD) {
|
|
Packit |
f574b8 |
me->anchor->header_length++;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
switch (me->state) {
|
|
Packit |
f574b8 |
begin_transparent:
|
|
Packit |
f574b8 |
case MIME_TRANSPARENT:
|
|
Packit |
f574b8 |
me->anchor->actual_length += 1;
|
|
Packit |
f574b8 |
(me->targetClass.put_character) (me->target, c);
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* RFC-2616 describes chunked transfer coding */
|
|
Packit |
f574b8 |
case mcCHUNKED_DATA:
|
|
Packit |
f574b8 |
(*me->targetClass.put_character) (me->target, c);
|
|
Packit |
f574b8 |
me->chunked_size--;
|
|
Packit |
f574b8 |
if (me->chunked_size <= 0)
|
|
Packit |
f574b8 |
me->state = mcCHUNKED_DATA_CR;
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case mcCHUNKED_DATA_CR:
|
|
Packit |
f574b8 |
me->state = mcCHUNKED_DATA_LF;
|
|
Packit |
f574b8 |
if (c == CR) {
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
/* FALLTHRU */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case mcCHUNKED_DATA_LF:
|
|
Packit |
f574b8 |
me->state = MIME_CHUNKED;
|
|
Packit |
f574b8 |
if (c == LF) {
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTIME_put_character expected LF in chunked data\n"));
|
|
Packit |
f574b8 |
me->state = MIME_TRANSPARENT;
|
|
Packit |
f574b8 |
goto begin_transparent;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* FALLTHRU */
|
|
Packit |
f574b8 |
begin_chunked:
|
|
Packit |
f574b8 |
case MIME_CHUNKED:
|
|
Packit |
f574b8 |
me->chunked_size = 0;
|
|
Packit |
f574b8 |
me->state = mcCHUNKED_COUNT_DIGIT;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* FALLTHRU */
|
|
Packit |
f574b8 |
case mcCHUNKED_COUNT_DIGIT:
|
|
Packit |
f574b8 |
if (isxdigit(UCH(c))) {
|
|
Packit |
f574b8 |
me->chunked_size <<= 4;
|
|
Packit |
f574b8 |
if (isdigit(UCH(c)))
|
|
Packit |
f574b8 |
me->chunked_size += UCH(c) - '0';
|
|
Packit |
f574b8 |
else
|
|
Packit |
f574b8 |
me->chunked_size += TOUPPER(UCH(c)) - 'A' + 10;
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (c == ';')
|
|
Packit |
f574b8 |
me->state = mcCHUNKED_EXTENSION;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* FALLTHRU */
|
|
Packit |
f574b8 |
case mcCHUNKED_EXTENSION:
|
|
Packit |
f574b8 |
if (c != CR && c != LF) {
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
me->state = mcCHUNKED_COUNT_CR;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* FALLTHRU */
|
|
Packit |
f574b8 |
case mcCHUNKED_COUNT_CR:
|
|
Packit |
f574b8 |
me->state = mcCHUNKED_COUNT_LF;
|
|
Packit |
f574b8 |
if (c == CR) {
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* FALLTHRU */
|
|
Packit |
f574b8 |
case mcCHUNKED_COUNT_LF:
|
|
Packit |
f574b8 |
me->state = ((me->chunked_size != 0)
|
|
Packit |
f574b8 |
? mcCHUNKED_DATA
|
|
Packit |
f574b8 |
: MIME_CHUNKED);
|
|
Packit |
f574b8 |
if (c == LF) {
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
goto begin_chunked;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* This slightly simple conversion just strips CR and turns LF to newline.
|
|
Packit |
f574b8 |
* On unix LF is \n but on Mac \n is CR for example. See NetToText for an
|
|
Packit |
f574b8 |
* implementation which preserves single CR or LF.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
if (me->net_ascii) {
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* <sigh> This is evidence that at one time, this code supported
|
|
Packit |
f574b8 |
* local character sets other than ASCII. But there is so much
|
|
Packit |
f574b8 |
* code in HTTP.c that depends on line_buffer's having been
|
|
Packit |
f574b8 |
* translated to local character set that I needed to put the
|
|
Packit |
f574b8 |
* FROMASCII translation there, leaving this translation purely
|
|
Packit |
f574b8 |
* destructive. -- gil
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
/* S/390 -- gil -- 0118 */
|
|
Packit |
f574b8 |
#ifndef NOT_ASCII
|
|
Packit |
f574b8 |
c = FROMASCII(c);
|
|
Packit |
f574b8 |
#endif /* NOT_ASCII */
|
|
Packit |
f574b8 |
if (c == CR)
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
else if (c == LF)
|
|
Packit |
f574b8 |
c = '\n';
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
switch (me->state) {
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case MIME_IGNORE:
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case MIME_TRANSPARENT: /* Not reached see above */
|
|
Packit |
f574b8 |
case MIME_CHUNKED:
|
|
Packit |
f574b8 |
case mcCHUNKED_COUNT_DIGIT:
|
|
Packit |
f574b8 |
case mcCHUNKED_COUNT_CR:
|
|
Packit |
f574b8 |
case mcCHUNKED_COUNT_LF:
|
|
Packit |
f574b8 |
case mcCHUNKED_EXTENSION:
|
|
Packit |
f574b8 |
case mcCHUNKED_DATA:
|
|
Packit |
f574b8 |
case mcCHUNKED_DATA_CR:
|
|
Packit |
f574b8 |
case mcCHUNKED_DATA_LF:
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case MIME_NET_ASCII:
|
|
Packit |
f574b8 |
(*me->targetClass.put_character) (me->target, c); /* MUST BE FAST */
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miNEWLINE:
|
|
Packit |
f574b8 |
if (c != '\n' && WHITE(c)) { /* Folded line */
|
|
Packit |
f574b8 |
me->state = me->fold_state; /* pop state before newline */
|
|
Packit |
f574b8 |
if (me->state == miGET_VALUE &&
|
|
Packit |
f574b8 |
me->value_pointer && me->value_pointer != me->value &&
|
|
Packit |
f574b8 |
!WHITE(*(me->value_pointer - 1))) {
|
|
Packit |
f574b8 |
c = ' ';
|
|
Packit |
f574b8 |
goto GET_VALUE; /* will add space to value if it fits - kw */
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
} else if (me->fold_state == miGET_VALUE) {
|
|
Packit |
f574b8 |
/* Got a field, and now we know it's complete - so
|
|
Packit |
f574b8 |
* act on it. - kw */
|
|
Packit |
f574b8 |
dispatchField(me);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
/* FALLTHRU */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miBEGINNING_OF_LINE:
|
|
Packit |
f574b8 |
me->net_ascii = YES;
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'a':
|
|
Packit |
f574b8 |
case 'A':
|
|
Packit |
f574b8 |
me->state = miA;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Got 'A' at beginning of line, state now A\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'c':
|
|
Packit |
f574b8 |
case 'C':
|
|
Packit |
f574b8 |
me->state = miC;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Got 'C' at beginning of line, state now C\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'd':
|
|
Packit |
f574b8 |
case 'D':
|
|
Packit |
f574b8 |
me->check_pointer = "ate:";
|
|
Packit |
f574b8 |
me->if_ok = miDATE;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Got 'D' at beginning of line, checking for 'ate:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'e':
|
|
Packit |
f574b8 |
case 'E':
|
|
Packit |
f574b8 |
me->state = miE;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Got 'E' at beginning of line, state now E\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'k':
|
|
Packit |
f574b8 |
case 'K':
|
|
Packit |
f574b8 |
me->check_pointer = "eep-alive:";
|
|
Packit |
f574b8 |
me->if_ok = miKEEP_ALIVE;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Got 'K' at beginning of line, checking for 'eep-alive:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'l':
|
|
Packit |
f574b8 |
case 'L':
|
|
Packit |
f574b8 |
me->state = miL;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Got 'L' at beginning of line, state now L\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'p':
|
|
Packit |
f574b8 |
case 'P':
|
|
Packit |
f574b8 |
me->state = miP;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Got 'P' at beginning of line, state now P\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'r':
|
|
Packit |
f574b8 |
case 'R':
|
|
Packit |
f574b8 |
me->state = miR;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Got 'R' at beginning of line, state now R\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 's':
|
|
Packit |
f574b8 |
case 'S':
|
|
Packit |
f574b8 |
me->state = miS;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Got 'S' at beginning of line, state now S\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 't':
|
|
Packit |
f574b8 |
case 'T':
|
|
Packit |
f574b8 |
me->state = miT;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Got 'T' at beginning of line, state now T\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'u':
|
|
Packit |
f574b8 |
case 'U':
|
|
Packit |
f574b8 |
me->state = miU;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Got 'U' at beginning of line, state now U\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'v':
|
|
Packit |
f574b8 |
case 'V':
|
|
Packit |
f574b8 |
me->state = miV;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Got 'V' at beginning of line, state now V\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'w':
|
|
Packit |
f574b8 |
case 'W':
|
|
Packit |
f574b8 |
me->state = miW;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Got 'W' at beginning of line, state now W\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case '\n': /* Blank line: End of Header! */
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
me->anchor->inHEAD = FALSE;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME length %" PRI_off_t "\n",
|
|
Packit |
f574b8 |
CAST_off_t (me->anchor->header_length)));
|
|
Packit |
f574b8 |
me->net_ascii = NO;
|
|
Packit |
f574b8 |
pumpData(me);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miA: /* Check for 'c','g' or 'l' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'c':
|
|
Packit |
f574b8 |
case 'C':
|
|
Packit |
f574b8 |
me->check_pointer = "cept-ranges:";
|
|
Packit |
f574b8 |
me->if_ok = miACCEPT_RANGES;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was A, found C, checking for 'cept-ranges:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'g':
|
|
Packit |
f574b8 |
case 'G':
|
|
Packit |
f574b8 |
me->check_pointer = "e:";
|
|
Packit |
f574b8 |
me->if_ok = miAGE;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was A, found G, checking for 'e:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'l':
|
|
Packit |
f574b8 |
case 'L':
|
|
Packit |
f574b8 |
me->state = miAL;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was A, found L, state now AL'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'g' or 'l'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miAL: /* Check for 'l' or 't' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'l':
|
|
Packit |
f574b8 |
case 'L':
|
|
Packit |
f574b8 |
me->check_pointer = "ow:";
|
|
Packit |
f574b8 |
me->if_ok = miALLOW;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was AL, found L, checking for 'ow:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 't':
|
|
Packit |
f574b8 |
case 'T':
|
|
Packit |
f574b8 |
me->check_pointer = "ernates:";
|
|
Packit |
f574b8 |
me->if_ok = miALTERNATES;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was AL, found T, checking for 'ernates:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'l' or 't'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miC: /* Check for 'a' or 'o' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'a':
|
|
Packit |
f574b8 |
case 'A':
|
|
Packit |
f574b8 |
me->check_pointer = "che-control:";
|
|
Packit |
f574b8 |
me->if_ok = miCACHE_CONTROL;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was C, found A, checking for 'che-control:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'o':
|
|
Packit |
f574b8 |
case 'O':
|
|
Packit |
f574b8 |
me->state = miCO;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was C, found O, state now CO'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'a' or 'o'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miCO: /* Check for 'n' or 'o' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'n':
|
|
Packit |
f574b8 |
case 'N':
|
|
Packit |
f574b8 |
me->state = miCON;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was CO, found N, state now CON\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'o':
|
|
Packit |
f574b8 |
case 'O':
|
|
Packit |
f574b8 |
me->check_pointer = "kie:";
|
|
Packit |
f574b8 |
me->if_ok = miCOOKIE;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was CO, found O, checking for 'kie:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'n' or 'o'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miCON: /* Check for 'n' or 't' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'n':
|
|
Packit |
f574b8 |
case 'N':
|
|
Packit |
f574b8 |
me->check_pointer = "ection:";
|
|
Packit |
f574b8 |
me->if_ok = miCONNECTION;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was CON, found N, checking for 'ection:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 't':
|
|
Packit |
f574b8 |
case 'T':
|
|
Packit |
f574b8 |
me->check_pointer = "ent-";
|
|
Packit |
f574b8 |
me->if_ok = miCONTENT_;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was CON, found T, checking for 'ent-'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'n' or 't'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miE: /* Check for 't' or 'x' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 't':
|
|
Packit |
f574b8 |
case 'T':
|
|
Packit |
f574b8 |
me->check_pointer = "ag:";
|
|
Packit |
f574b8 |
me->if_ok = miETAG;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was E, found T, checking for 'ag:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'x':
|
|
Packit |
f574b8 |
case 'X':
|
|
Packit |
f574b8 |
me->check_pointer = "pires:";
|
|
Packit |
f574b8 |
me->if_ok = miEXPIRES;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was E, found X, checking for 'pires:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'t' or 'x'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miL: /* Check for 'a', 'i' or 'o' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'a':
|
|
Packit |
f574b8 |
case 'A':
|
|
Packit |
f574b8 |
me->check_pointer = "st-modified:";
|
|
Packit |
f574b8 |
me->if_ok = miLAST_MODIFIED;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was L, found A, checking for 'st-modified:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'i':
|
|
Packit |
f574b8 |
case 'I':
|
|
Packit |
f574b8 |
me->check_pointer = "nk:";
|
|
Packit |
f574b8 |
me->if_ok = miLINK;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was L, found I, checking for 'nk:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'o':
|
|
Packit |
f574b8 |
case 'O':
|
|
Packit |
f574b8 |
me->check_pointer = "cation:";
|
|
Packit |
f574b8 |
me->if_ok = miLOCATION;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was L, found O, checking for 'cation:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'a', 'i' or 'o'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miP: /* Check for 'r' or 'u' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'r':
|
|
Packit |
f574b8 |
case 'R':
|
|
Packit |
f574b8 |
me->state = miPR;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was P, found R, state now PR'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'u':
|
|
Packit |
f574b8 |
case 'U':
|
|
Packit |
f574b8 |
me->check_pointer = "blic:";
|
|
Packit |
f574b8 |
me->if_ok = miPUBLIC;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was P, found U, checking for 'blic:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'r' or 'u'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miPR: /* Check for 'a' or 'o' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'a':
|
|
Packit |
f574b8 |
case 'A':
|
|
Packit |
f574b8 |
me->check_pointer = "gma:";
|
|
Packit |
f574b8 |
me->if_ok = miPRAGMA;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was PR, found A, checking for 'gma'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'o':
|
|
Packit |
f574b8 |
case 'O':
|
|
Packit |
f574b8 |
me->check_pointer = "xy-authenticate:";
|
|
Packit |
f574b8 |
me->if_ok = miPROXY_AUTHENTICATE;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was PR, found O, checking for 'xy-authenticate'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'a' or 'o'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miR: /* Check for 'e' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'e':
|
|
Packit |
f574b8 |
case 'E':
|
|
Packit |
f574b8 |
me->state = miRE;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was R, found E\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'e'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miRE: /* Check for 'a' or 'o' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'f':
|
|
Packit |
f574b8 |
case 'F': /* nonstandard: Netscape */
|
|
Packit |
f574b8 |
me->check_pointer = "resh:";
|
|
Packit |
f574b8 |
me->if_ok = miREFRESH;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was RE, found F, checking for '%s'\n", me->check_pointer));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 't':
|
|
Packit |
f574b8 |
case 'T':
|
|
Packit |
f574b8 |
me->check_pointer = "ry-after:";
|
|
Packit |
f574b8 |
me->if_ok = miRETRY_AFTER;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was RE, found T, checking for '%s'\n", me->check_pointer));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'f' or 't'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miS: /* Check for 'a' or 'e' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'a':
|
|
Packit |
f574b8 |
case 'A':
|
|
Packit |
f574b8 |
me->check_pointer = "fe:";
|
|
Packit |
f574b8 |
me->if_ok = miSAFE;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was S, found A, checking for 'fe:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'e':
|
|
Packit |
f574b8 |
case 'E':
|
|
Packit |
f574b8 |
me->state = miSE;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was S, found E, state now SE'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'a' or 'e'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miSE: /* Check for 'r' or 't' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'r':
|
|
Packit |
f574b8 |
case 'R':
|
|
Packit |
f574b8 |
me->check_pointer = "ver:";
|
|
Packit |
f574b8 |
me->if_ok = miSERVER;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was SE, found R, checking for 'ver'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 't':
|
|
Packit |
f574b8 |
case 'T':
|
|
Packit |
f574b8 |
me->check_pointer = "-cookie";
|
|
Packit |
f574b8 |
me->if_ok = miSET_COOKIE;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was SE, found T, checking for '-cookie'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'r' or 't'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miSET_COOKIE: /* Check for ':' or '2' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case ':':
|
|
Packit |
f574b8 |
me->field = miSET_COOKIE1; /* remember it */
|
|
Packit |
f574b8 |
me->state = miSKIP_GET_VALUE;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was SET_COOKIE, found :, processing\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case '2':
|
|
Packit |
f574b8 |
me->check_pointer = ":";
|
|
Packit |
f574b8 |
me->if_ok = miSET_COOKIE2;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was SET_COOKIE, found 2, checking for ':'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "':' or '2'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miT: /* Check for 'i' or 'r' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'i':
|
|
Packit |
f574b8 |
case 'I':
|
|
Packit |
f574b8 |
me->check_pointer = "tle:";
|
|
Packit |
f574b8 |
me->if_ok = miTITLE;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was T, found I, checking for 'tle:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'r':
|
|
Packit |
f574b8 |
case 'R':
|
|
Packit |
f574b8 |
me->check_pointer = "ansfer-encoding:";
|
|
Packit |
f574b8 |
me->if_ok = miTRANSFER_ENCODING;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was T, found R, checking for 'ansfer-encoding'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'i' or 'r'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miU: /* Check for 'p' or 'r' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'p':
|
|
Packit |
f574b8 |
case 'P':
|
|
Packit |
f574b8 |
me->check_pointer = "grade:";
|
|
Packit |
f574b8 |
me->if_ok = miUPGRADE;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was U, found P, checking for 'grade:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'r':
|
|
Packit |
f574b8 |
case 'R':
|
|
Packit |
f574b8 |
me->check_pointer = "i:";
|
|
Packit |
f574b8 |
me->if_ok = miURI;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was U, found R, checking for 'i:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'p' or 'r'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miV: /* Check for 'a' or 'i' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'a':
|
|
Packit |
f574b8 |
case 'A':
|
|
Packit |
f574b8 |
me->check_pointer = "ry:";
|
|
Packit |
f574b8 |
me->if_ok = miVARY;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was V, found A, checking for 'ry:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'i':
|
|
Packit |
f574b8 |
case 'I':
|
|
Packit |
f574b8 |
me->check_pointer = "a:";
|
|
Packit |
f574b8 |
me->if_ok = miVIA;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was V, found I, checking for 'a:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'a' or 'i'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miW: /* Check for 'a' or 'w' */
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'a':
|
|
Packit |
f574b8 |
case 'A':
|
|
Packit |
f574b8 |
me->check_pointer = "rning:";
|
|
Packit |
f574b8 |
me->if_ok = miWARNING;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was W, found A, checking for 'rning:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'w':
|
|
Packit |
f574b8 |
case 'W':
|
|
Packit |
f574b8 |
me->check_pointer = "w-authenticate:";
|
|
Packit |
f574b8 |
me->if_ok = miWWW_AUTHENTICATE;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was W, found W, checking for 'w-authenticate:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, "'a' or 'w'"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miCHECK: /* Check against string */
|
|
Packit |
f574b8 |
if (TOLOWER(c) == *(me->check_pointer)++) {
|
|
Packit |
f574b8 |
if (!*me->check_pointer)
|
|
Packit |
f574b8 |
me->state = me->if_ok;
|
|
Packit |
f574b8 |
} else { /* Error */
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Bad character `%c' found where `%s' expected\n",
|
|
Packit |
f574b8 |
c, me->check_pointer - 1));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miCONTENT_:
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: in case CONTENT_\n"));
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'b':
|
|
Packit |
f574b8 |
case 'B':
|
|
Packit |
f574b8 |
me->check_pointer = "ase:";
|
|
Packit |
f574b8 |
me->if_ok = miCONTENT_BASE;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was CONTENT_, found B, checking for 'ase:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'd':
|
|
Packit |
f574b8 |
case 'D':
|
|
Packit |
f574b8 |
me->check_pointer = "isposition:";
|
|
Packit |
f574b8 |
me->if_ok = miCONTENT_DISPOSITION;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was CONTENT_, found D, checking for 'isposition:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'e':
|
|
Packit |
f574b8 |
case 'E':
|
|
Packit |
f574b8 |
me->check_pointer = "ncoding:";
|
|
Packit |
f574b8 |
me->if_ok = miCONTENT_ENCODING;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was CONTENT_, found E, checking for 'ncoding:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'f':
|
|
Packit |
f574b8 |
case 'F':
|
|
Packit |
f574b8 |
me->check_pointer = "eatures:";
|
|
Packit |
f574b8 |
me->if_ok = miCONTENT_FEATURES;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was CONTENT_, found F, checking for 'eatures:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'l':
|
|
Packit |
f574b8 |
case 'L':
|
|
Packit |
f574b8 |
me->state = miCONTENT_L;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was CONTENT_, found L, state now CONTENT_L\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'm':
|
|
Packit |
f574b8 |
case 'M':
|
|
Packit |
f574b8 |
me->check_pointer = "d5:";
|
|
Packit |
f574b8 |
me->if_ok = miCONTENT_MD5;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was CONTENT_, found M, checking for 'd5:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'r':
|
|
Packit |
f574b8 |
case 'R':
|
|
Packit |
f574b8 |
me->check_pointer = "ange:";
|
|
Packit |
f574b8 |
me->if_ok = miCONTENT_RANGE;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was CONTENT_, found R, checking for 'ange:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 't':
|
|
Packit |
f574b8 |
case 'T':
|
|
Packit |
f574b8 |
me->state = miCONTENT_T;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was CONTENT_, found T, state now CONTENT_T\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was CONTENT_, found nothing; bleah\n"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miCONTENT_L:
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: in case CONTENT_L\n"));
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'a':
|
|
Packit |
f574b8 |
case 'A':
|
|
Packit |
f574b8 |
me->check_pointer = "nguage:";
|
|
Packit |
f574b8 |
me->if_ok = miCONTENT_LANGUAGE;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was CONTENT_L, found A, checking for 'nguage:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'e':
|
|
Packit |
f574b8 |
case 'E':
|
|
Packit |
f574b8 |
me->check_pointer = "ngth:";
|
|
Packit |
f574b8 |
me->if_ok = miCONTENT_LENGTH;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was CONTENT_L, found E, checking for 'ngth:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'o':
|
|
Packit |
f574b8 |
case 'O':
|
|
Packit |
f574b8 |
me->check_pointer = "cation:";
|
|
Packit |
f574b8 |
me->if_ok = miCONTENT_LOCATION;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was CONTENT_L, found O, checking for 'cation:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was CONTENT_L, found nothing; bleah\n"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miCONTENT_T:
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: in case CONTENT_T\n"));
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
switch (c) {
|
|
Packit |
f574b8 |
case 'r':
|
|
Packit |
f574b8 |
case 'R':
|
|
Packit |
f574b8 |
me->check_pointer = "ansfer-encoding:";
|
|
Packit |
f574b8 |
me->if_ok = miCONTENT_TRANSFER_ENCODING;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was CONTENT_T, found R, checking for 'ansfer-encoding:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case 'y':
|
|
Packit |
f574b8 |
case 'Y':
|
|
Packit |
f574b8 |
me->check_pointer = "pe:";
|
|
Packit |
f574b8 |
me->if_ok = miCONTENT_TYPE;
|
|
Packit |
f574b8 |
me->state = miCHECK;
|
|
Packit |
f574b8 |
CTRACE((tfp,
|
|
Packit |
f574b8 |
"HTMIME: Was CONTENT_T, found Y, checking for 'pe:'\n"));
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
default:
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: Was CONTENT_T, found nothing; bleah\n"));
|
|
Packit |
f574b8 |
goto bad_field_name;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on character */
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miACCEPT_RANGES:
|
|
Packit |
f574b8 |
case miAGE:
|
|
Packit |
f574b8 |
case miALLOW:
|
|
Packit |
f574b8 |
case miALTERNATES:
|
|
Packit |
f574b8 |
case miCACHE_CONTROL:
|
|
Packit |
f574b8 |
case miCOOKIE:
|
|
Packit |
f574b8 |
case miCONNECTION:
|
|
Packit |
f574b8 |
case miCONTENT_BASE:
|
|
Packit |
f574b8 |
case miCONTENT_DISPOSITION:
|
|
Packit |
f574b8 |
case miCONTENT_ENCODING:
|
|
Packit |
f574b8 |
case miCONTENT_FEATURES:
|
|
Packit |
f574b8 |
case miCONTENT_LANGUAGE:
|
|
Packit |
f574b8 |
case miCONTENT_LENGTH:
|
|
Packit |
f574b8 |
case miCONTENT_LOCATION:
|
|
Packit |
f574b8 |
case miCONTENT_MD5:
|
|
Packit |
f574b8 |
case miCONTENT_RANGE:
|
|
Packit |
f574b8 |
case miCONTENT_TRANSFER_ENCODING:
|
|
Packit |
f574b8 |
case miCONTENT_TYPE:
|
|
Packit |
f574b8 |
case miDATE:
|
|
Packit |
f574b8 |
case miETAG:
|
|
Packit |
f574b8 |
case miEXPIRES:
|
|
Packit |
f574b8 |
case miKEEP_ALIVE:
|
|
Packit |
f574b8 |
case miLAST_MODIFIED:
|
|
Packit |
f574b8 |
case miLINK:
|
|
Packit |
f574b8 |
case miLOCATION:
|
|
Packit |
f574b8 |
case miPRAGMA:
|
|
Packit |
f574b8 |
case miPROXY_AUTHENTICATE:
|
|
Packit |
f574b8 |
case miPUBLIC:
|
|
Packit |
f574b8 |
case miREFRESH:
|
|
Packit |
f574b8 |
case miRETRY_AFTER:
|
|
Packit |
f574b8 |
case miSAFE:
|
|
Packit |
f574b8 |
case miSERVER:
|
|
Packit |
f574b8 |
case miSET_COOKIE1:
|
|
Packit |
f574b8 |
case miSET_COOKIE2:
|
|
Packit |
f574b8 |
case miTITLE:
|
|
Packit |
f574b8 |
case miTRANSFER_ENCODING:
|
|
Packit |
f574b8 |
case miUPGRADE:
|
|
Packit |
f574b8 |
case miURI:
|
|
Packit |
f574b8 |
case miVARY:
|
|
Packit |
f574b8 |
case miVIA:
|
|
Packit |
f574b8 |
case miWARNING:
|
|
Packit |
f574b8 |
case miWWW_AUTHENTICATE:
|
|
Packit |
f574b8 |
me->field = me->state; /* remember it */
|
|
Packit |
f574b8 |
me->state = miSKIP_GET_VALUE;
|
|
Packit |
f574b8 |
/* FALLTHRU */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miSKIP_GET_VALUE:
|
|
Packit |
f574b8 |
if (c == '\n') {
|
|
Packit |
f574b8 |
me->fold_state = me->state;
|
|
Packit |
f574b8 |
me->state = miNEWLINE;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (WHITE(c))
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Skip white space.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
me->value_pointer = me->value;
|
|
Packit |
f574b8 |
me->state = miGET_VALUE;
|
|
Packit |
f574b8 |
/* Fall through to store first character */
|
|
Packit |
f574b8 |
/* FALLTHRU */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miGET_VALUE:
|
|
Packit |
f574b8 |
GET_VALUE:
|
|
Packit |
f574b8 |
if (c != '\n') { /* Not end of line */
|
|
Packit |
f574b8 |
if (me->value_pointer < me->value + VALUE_SIZE - 1) {
|
|
Packit |
f574b8 |
*me->value_pointer++ = (char) c;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
goto value_too_long;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
/* Fall through (if end of line) */
|
|
Packit |
f574b8 |
/* FALLTHRU */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
case miJUNK_LINE:
|
|
Packit |
f574b8 |
if (c == '\n') {
|
|
Packit |
f574b8 |
me->fold_state = me->state;
|
|
Packit |
f574b8 |
me->state = miNEWLINE;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} /* switch on state */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
HTChunkPutc(&me->anchor->http_headers, UCH(c));
|
|
Packit |
f574b8 |
if (me->state == MIME_TRANSPARENT) {
|
|
Packit |
f574b8 |
HTChunkTerminate(&me->anchor->http_headers);
|
|
Packit |
f574b8 |
CTRACE((tfp, "Server Headers (%d bytes):\n%.*s\n",
|
|
Packit |
f574b8 |
me->anchor->http_headers.size,
|
|
Packit |
f574b8 |
me->anchor->http_headers.size,
|
|
Packit |
f574b8 |
me->anchor->http_headers.data));
|
|
Packit |
f574b8 |
CTRACE((tfp, "Server Content-Type:%s\n",
|
|
Packit |
f574b8 |
me->anchor->content_type_params));
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
value_too_long:
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: *** Syntax error. (string too long)\n"));
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
bad_field_name: /* Ignore it */
|
|
Packit |
f574b8 |
me->state = miJUNK_LINE;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
HTChunkPutc(&me->anchor->http_headers, UCH(c));
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* String handling
|
|
Packit |
f574b8 |
* ---------------
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* Strings must be smaller than this buffer size.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
static void HTMIME_put_string(HTStream *me,
|
|
Packit |
f574b8 |
const char *s)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
const char *p;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (me->state == MIME_TRANSPARENT) { /* Optimisation */
|
|
Packit |
f574b8 |
(*me->targetClass.put_string) (me->target, s);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} else if (me->state != MIME_IGNORE) {
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: %s\n", s));
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
for (p = s; *p; p++)
|
|
Packit |
f574b8 |
HTMIME_put_character(me, *p);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* Buffer write. Buffers can (and should!) be big.
|
|
Packit |
f574b8 |
* ------------
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
static void HTMIME_write(HTStream *me,
|
|
Packit |
f574b8 |
const char *s,
|
|
Packit |
f574b8 |
int l)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
const char *p;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (me->state == MIME_TRANSPARENT) { /* Optimisation */
|
|
Packit |
f574b8 |
(*me->targetClass.put_block) (me->target, s, l);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIME: %.*s\n", l, s));
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
for (p = s; p < s + l; p++)
|
|
Packit |
f574b8 |
HTMIME_put_character(me, *p);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* Free an HTML object
|
|
Packit |
f574b8 |
* -------------------
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
static void HTMIME_free(HTStream *me)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
if (me) {
|
|
Packit |
f574b8 |
FREE(me->location);
|
|
Packit |
f574b8 |
FREE(me->compression_encoding);
|
|
Packit |
f574b8 |
if (me->target)
|
|
Packit |
f574b8 |
(*me->targetClass._free) (me->target);
|
|
Packit |
f574b8 |
FREE(me);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* End writing
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
static void HTMIME_abort(HTStream *me,
|
|
Packit |
f574b8 |
HTError e)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
if (me) {
|
|
Packit |
f574b8 |
FREE(me->location);
|
|
Packit |
f574b8 |
FREE(me->compression_encoding);
|
|
Packit |
f574b8 |
if (me->target)
|
|
Packit |
f574b8 |
(*me->targetClass._abort) (me->target, e);
|
|
Packit |
f574b8 |
FREE(me);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* Structured Object Class
|
|
Packit |
f574b8 |
* -----------------------
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
static const HTStreamClass HTMIME =
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
"MIMEParser",
|
|
Packit |
f574b8 |
HTMIME_free,
|
|
Packit |
f574b8 |
HTMIME_abort,
|
|
Packit |
f574b8 |
HTMIME_put_character,
|
|
Packit |
f574b8 |
HTMIME_put_string,
|
|
Packit |
f574b8 |
HTMIME_write
|
|
Packit |
f574b8 |
};
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* Subclass-specific Methods
|
|
Packit |
f574b8 |
* -------------------------
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
HTStream *HTMIMEConvert(HTPresentation *pres,
|
|
Packit |
f574b8 |
HTParentAnchor *anchor,
|
|
Packit |
f574b8 |
HTStream *sink)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
HTStream *me;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
CTRACE((tfp, "HTMIMEConvert\n"));
|
|
Packit |
f574b8 |
me = typecalloc(HTStream);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (me == NULL)
|
|
Packit |
f574b8 |
outofmem(__FILE__, "HTMIMEConvert");
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
me->isa = &HTMIME;
|
|
Packit |
f574b8 |
me->sink = sink;
|
|
Packit |
f574b8 |
me->anchor = anchor;
|
|
Packit |
f574b8 |
me->anchor->safe = FALSE;
|
|
Packit |
f574b8 |
me->anchor->no_cache = FALSE;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
FREE(me->anchor->cache_control);
|
|
Packit |
f574b8 |
FREE(me->anchor->SugFname);
|
|
Packit |
f574b8 |
FREE(me->anchor->charset);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
HTChunkClear(&me->anchor->http_headers);
|
|
Packit |
f574b8 |
HTChunkInit(&me->anchor->http_headers, 128);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
FREE(me->anchor->content_type_params);
|
|
Packit |
f574b8 |
FREE(me->anchor->content_language);
|
|
Packit |
f574b8 |
FREE(me->anchor->content_encoding);
|
|
Packit |
f574b8 |
FREE(me->anchor->content_base);
|
|
Packit |
f574b8 |
FREE(me->anchor->content_disposition);
|
|
Packit |
f574b8 |
FREE(me->anchor->content_location);
|
|
Packit |
f574b8 |
FREE(me->anchor->content_md5);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
me->anchor->inHEAD = TRUE;
|
|
Packit |
f574b8 |
me->anchor->header_length = 0;
|
|
Packit |
f574b8 |
me->anchor->content_length = 0;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
FREE(me->anchor->date);
|
|
Packit |
f574b8 |
FREE(me->anchor->expires);
|
|
Packit |
f574b8 |
FREE(me->anchor->last_modified);
|
|
Packit |
f574b8 |
FREE(me->anchor->ETag);
|
|
Packit |
f574b8 |
FREE(me->anchor->server);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
me->target = NULL;
|
|
Packit |
f574b8 |
me->state = miBEGINNING_OF_LINE;
|
|
Packit |
f574b8 |
me->format = HTAtom_for(ContentTypes[LYContentType]);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
CTRACE((tfp, "default Content-Type is %s\n", HTAtom_name(me->format)));
|
|
Packit |
f574b8 |
me->targetRep = pres->rep_out;
|
|
Packit |
f574b8 |
me->boundary = NULL; /* Not set yet */
|
|
Packit |
f574b8 |
me->set_cookie = NULL; /* Not set yet */
|
|
Packit |
f574b8 |
me->set_cookie2 = NULL; /* Not set yet */
|
|
Packit |
f574b8 |
me->refresh_url = NULL; /* Not set yet */
|
|
Packit |
f574b8 |
me->c_t_encoding = 0; /* Not set yet */
|
|
Packit |
f574b8 |
me->compression_encoding = NULL; /* Not set yet */
|
|
Packit |
f574b8 |
me->net_ascii = NO; /* Local character set */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
HTAnchor_setUCInfoStage(me->anchor, current_char_set,
|
|
Packit |
f574b8 |
UCT_STAGE_STRUCTURED,
|
|
Packit |
f574b8 |
UCT_SETBY_DEFAULT);
|
|
Packit |
f574b8 |
HTAnchor_setUCInfoStage(me->anchor, current_char_set,
|
|
Packit |
f574b8 |
UCT_STAGE_HTEXT,
|
|
Packit |
f574b8 |
UCT_SETBY_DEFAULT);
|
|
Packit |
f574b8 |
return me;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
HTStream *HTNetMIME(HTPresentation *pres,
|
|
Packit |
f574b8 |
HTParentAnchor *anchor,
|
|
Packit |
f574b8 |
HTStream *sink)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
HTStream *me = HTMIMEConvert(pres, anchor, sink);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (!me)
|
|
Packit |
f574b8 |
return NULL;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
me->net_ascii = YES;
|
|
Packit |
f574b8 |
return me;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
HTStream *HTMIMERedirect(HTPresentation *pres,
|
|
Packit |
f574b8 |
HTParentAnchor *anchor,
|
|
Packit |
f574b8 |
HTStream *sink)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
HTStream *me = HTMIMEConvert(pres, anchor, sink);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (!me)
|
|
Packit |
f574b8 |
return NULL;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
me->pickup_redirection = YES;
|
|
Packit |
f574b8 |
if (me->targetRep == WWW_DEBUG && sink)
|
|
Packit |
f574b8 |
me->no_streamstack = YES;
|
|
Packit |
f574b8 |
return me;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/* Japanese header handling functions
|
|
Packit |
f574b8 |
* ==================================
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* K&Rized and added 07-Jun-96 by FM, based on:
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
////////////////////////////////////////////////////////////////////////
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* ISO-2022-JP handling routines
|
|
Packit |
f574b8 |
* &
|
|
Packit |
f574b8 |
* MIME decode routines (quick hack just for ISO-2022-JP)
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* Thu Jan 25 10:11:42 JST 1996
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* Copyright (C) 1994, 1995, 1996
|
|
Packit |
f574b8 |
* Shuichi Ichikawa (ichikawa@nuee.nagoya-u.ac.jp)
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
f574b8 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
f574b8 |
* the Free Software Foundation; either versions 2, or (at your option)
|
|
Packit |
f574b8 |
* any later version.
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* This program is distributed in the hope that it will be useful
|
|
Packit |
f574b8 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
f574b8 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
f574b8 |
* GNU General Public License for more details.
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
f574b8 |
* along with SKK, see the file COPYING. If not, write to the Free
|
|
Packit |
f574b8 |
* Software Foundation Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* MIME decoding routines
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* Written by S. Ichikawa,
|
|
Packit |
f574b8 |
* partially inspired by encdec.c of <jh@efd.lth.se>.
|
|
Packit |
f574b8 |
* Caller's buffers decode to no longer than the input strings.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
#include <LYCharVals.h> /* S/390 -- gil -- 0163 */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
static char HTmm64[] =
|
|
Packit |
f574b8 |
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
|
Packit |
f574b8 |
static char HTmmquote[] = "0123456789ABCDEF";
|
|
Packit |
f574b8 |
static int HTmmcont = 0;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
static void HTmmdec_base64(char **t,
|
|
Packit |
f574b8 |
char *s)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
int d, count, j, val;
|
|
Packit |
f574b8 |
char *buf, *bp, nw[4], *p;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if ((buf = typeMallocn(char, strlen(s) * 3 + 1)) == 0)
|
|
Packit |
f574b8 |
outofmem(__FILE__, "HTmmdec_base64");
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
for (bp = buf; *s; s += 4) {
|
|
Packit |
f574b8 |
val = 0;
|
|
Packit |
f574b8 |
if (s[2] == '=')
|
|
Packit |
f574b8 |
count = 1;
|
|
Packit |
f574b8 |
else if (s[3] == '=')
|
|
Packit |
f574b8 |
count = 2;
|
|
Packit |
f574b8 |
else
|
|
Packit |
f574b8 |
count = 3;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
for (j = 0; j <= count; j++) {
|
|
Packit |
f574b8 |
if (!(p = StrChr(HTmm64, s[j]))) {
|
|
Packit |
f574b8 |
FREE(buf);
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
d = (int) (p - HTmm64);
|
|
Packit |
f574b8 |
d <<= (3 - j) * 6;
|
|
Packit |
f574b8 |
val += d;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
for (j = 2; j >= 0; j--) {
|
|
Packit |
f574b8 |
nw[j] = (char) (val & 255);
|
|
Packit |
f574b8 |
val >>= 8;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (count--)
|
|
Packit |
f574b8 |
*bp++ = nw[0];
|
|
Packit |
f574b8 |
if (count--)
|
|
Packit |
f574b8 |
*bp++ = nw[1];
|
|
Packit |
f574b8 |
if (count)
|
|
Packit |
f574b8 |
*bp++ = nw[2];
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
*bp = '\0';
|
|
Packit |
f574b8 |
StrAllocCopy(*t, buf);
|
|
Packit |
f574b8 |
FREE(buf);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
static void HTmmdec_quote(char **t,
|
|
Packit |
f574b8 |
char *s)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
char *buf, cval, *bp, *p;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if ((buf = typeMallocn(char, strlen(s) + 1)) == 0)
|
|
Packit |
f574b8 |
outofmem(__FILE__, "HTmmdec_quote");
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
for (bp = buf; *s;) {
|
|
Packit |
f574b8 |
if (*s == '=') {
|
|
Packit |
f574b8 |
cval = 0;
|
|
Packit |
f574b8 |
if (s[1] && (p = StrChr(HTmmquote, s[1]))) {
|
|
Packit |
f574b8 |
cval = (char) (cval + (char) (p - HTmmquote));
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
*bp++ = *s++;
|
|
Packit |
f574b8 |
continue;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (s[2] && (p = StrChr(HTmmquote, s[2]))) {
|
|
Packit |
f574b8 |
cval = (char) (cval << 4);
|
|
Packit |
f574b8 |
cval = (char) (cval + (p - HTmmquote));
|
|
Packit |
f574b8 |
*bp++ = cval;
|
|
Packit |
f574b8 |
s += 3;
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
*bp++ = *s++;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
} else if (*s == '_') {
|
|
Packit |
f574b8 |
*bp++ = 0x20;
|
|
Packit |
f574b8 |
s++;
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
*bp++ = *s++;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
*bp = '\0';
|
|
Packit |
f574b8 |
StrAllocCopy(*t, buf);
|
|
Packit |
f574b8 |
FREE(buf);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* HTmmdecode for ISO-2022-JP - FM
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
void HTmmdecode(char **target,
|
|
Packit |
f574b8 |
char *source)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
char *buf;
|
|
Packit |
f574b8 |
char *mmbuf = NULL;
|
|
Packit |
f574b8 |
char *m2buf = NULL;
|
|
Packit |
f574b8 |
char *s, *t, *u;
|
|
Packit |
f574b8 |
int base64, quote;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if ((buf = typeMallocn(char, strlen(source) + 1)) == 0)
|
|
Packit |
f574b8 |
outofmem(__FILE__, "HTmmdecode");
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
for (s = source, u = buf; *s;) {
|
|
Packit |
f574b8 |
if (!strncasecomp(s, "=?ISO-2022-JP?B?", 16)) {
|
|
Packit |
f574b8 |
base64 = 1;
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
base64 = 0;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (!strncasecomp(s, "=?ISO-2022-JP?Q?", 16)) {
|
|
Packit |
f574b8 |
quote = 1;
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
quote = 0;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (base64 || quote) {
|
|
Packit |
f574b8 |
if (HTmmcont) {
|
|
Packit |
f574b8 |
for (t = s - 1;
|
|
Packit |
f574b8 |
t >= source && (*t == ' ' || *t == '\t'); t--) {
|
|
Packit |
f574b8 |
u--;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (mmbuf == 0) /* allocate buffer big enough for source */
|
|
Packit |
f574b8 |
StrAllocCopy(mmbuf, source);
|
|
Packit |
f574b8 |
for (s += 16, t = mmbuf; *s;) {
|
|
Packit |
f574b8 |
if (s[0] == '?' && s[1] == '=') {
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
*t++ = *s++;
|
|
Packit |
f574b8 |
*t = '\0';
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (s[0] != '?' || s[1] != '=') {
|
|
Packit |
f574b8 |
goto end;
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
s += 2;
|
|
Packit |
f574b8 |
*t = '\0';
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (base64)
|
|
Packit |
f574b8 |
HTmmdec_base64(&m2buf, mmbuf);
|
|
Packit |
f574b8 |
else
|
|
Packit |
f574b8 |
HTmmdec_quote(&m2buf, mmbuf);
|
|
Packit |
f574b8 |
for (t = m2buf; non_empty(t);)
|
|
Packit |
f574b8 |
*u++ = *t++;
|
|
Packit |
f574b8 |
HTmmcont = 1;
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
if (*s != ' ' && *s != '\t')
|
|
Packit |
f574b8 |
HTmmcont = 0;
|
|
Packit |
f574b8 |
*u++ = *s++;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
*u = '\0';
|
|
Packit |
f574b8 |
end:
|
|
Packit |
f574b8 |
StrAllocCopy(*target, buf);
|
|
Packit |
f574b8 |
FREE(m2buf);
|
|
Packit |
f574b8 |
FREE(mmbuf);
|
|
Packit |
f574b8 |
FREE(buf);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Insert ESC where it seems lost.
|
|
Packit |
f574b8 |
* (The author of this function "rjis" is S. Ichikawa.)
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
int HTrjis(char **t,
|
|
Packit |
f574b8 |
char *s)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
char *p;
|
|
Packit |
f574b8 |
char *buf = NULL;
|
|
Packit |
f574b8 |
int kanji = 0;
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (StrChr(s, CH_ESC) || !StrChr(s, '$')) {
|
|
Packit |
f574b8 |
if (s != *t)
|
|
Packit |
f574b8 |
StrAllocCopy(*t, s);
|
|
Packit |
f574b8 |
return 1;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if ((buf = typeMallocn(char, strlen(s) * 2 + 1)) == 0)
|
|
Packit |
f574b8 |
outofmem(__FILE__, "HTrjis");
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
for (p = buf; *s;) {
|
|
Packit |
f574b8 |
if (!kanji && s[0] == '$' && (s[1] == '@' || s[1] == 'B')) {
|
|
Packit |
f574b8 |
if (HTmaybekanji((int) s[2], (int) s[3])) {
|
|
Packit |
f574b8 |
kanji = 1;
|
|
Packit |
f574b8 |
*p++ = CH_ESC;
|
|
Packit |
f574b8 |
*p++ = *s++;
|
|
Packit |
f574b8 |
*p++ = *s++;
|
|
Packit |
f574b8 |
*p++ = *s++;
|
|
Packit |
f574b8 |
*p++ = *s++;
|
|
Packit |
f574b8 |
continue;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
*p++ = *s++;
|
|
Packit |
f574b8 |
continue;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (kanji && s[0] == '(' && (s[1] == 'J' || s[1] == 'B')) {
|
|
Packit |
f574b8 |
kanji = 0;
|
|
Packit |
f574b8 |
*p++ = CH_ESC;
|
|
Packit |
f574b8 |
*p++ = *s++;
|
|
Packit |
f574b8 |
*p++ = *s++;
|
|
Packit |
f574b8 |
continue;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
*p++ = *s++;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
*p = *s; /* terminate string */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
StrAllocCopy(*t, buf);
|
|
Packit |
f574b8 |
FREE(buf);
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* The following function "maybekanji" is derived from
|
|
Packit |
f574b8 |
* RJIS-1.0 by Mr. Hironobu Takahashi.
|
|
Packit |
f574b8 |
* Maybekanji() is included here under the courtesy of the author.
|
|
Packit |
f574b8 |
* The original comment of rjis.c is also included here.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* RJIS ( Recover JIS code from broken file )
|
|
Packit |
f574b8 |
* Copyright (C) 1992 1994
|
|
Packit |
f574b8 |
* Hironobu Takahashi (takahasi@tiny.or.jp)
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
f574b8 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
f574b8 |
* the Free Software Foundation; either versions 2, or (at your option)
|
|
Packit |
f574b8 |
* any later version.
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* This program is distributed in the hope that it will be useful
|
|
Packit |
f574b8 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
f574b8 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
f574b8 |
* GNU General Public License for more details.
|
|
Packit |
f574b8 |
*
|
|
Packit |
f574b8 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
f574b8 |
* along with SKK, see the file COPYING. If not, write to the Free
|
|
Packit |
f574b8 |
* Software Foundation Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
int HTmaybekanji(int c1,
|
|
Packit |
f574b8 |
int c2)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if ((c2 < 33) || (c2 > 126))
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
if ((c1 < 33) || ((40 < c1) && (c1 < 48)) || (116 < c1))
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
c2 -= 32;
|
|
Packit |
f574b8 |
switch (c1 - 32) {
|
|
Packit |
f574b8 |
case 2:
|
|
Packit |
f574b8 |
if ((14 < c2) && (c2 < 26))
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
if ((33 < c2) && (c2 < 42))
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
if ((48 < c2) && (c2 < 60))
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
if ((74 < c2) && (c2 < 82))
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
if ((89 < c2) && (c2 < 94))
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case 3:
|
|
Packit |
f574b8 |
if (c2 < 16)
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
if ((25 < c2) && (c2 < 33))
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
if ((58 < c2) && (c2 < 65))
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
if (90 < c2)
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case 4:
|
|
Packit |
f574b8 |
if (83 < c2)
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case 5:
|
|
Packit |
f574b8 |
if (86 < c2)
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case 6:
|
|
Packit |
f574b8 |
if ((24 < c2) && (c2 < 33))
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
if (56 < c2)
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case 7:
|
|
Packit |
f574b8 |
if ((33 < c2) && (c2 < 49))
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
if (81 < c2)
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case 8:
|
|
Packit |
f574b8 |
if (32 < c2)
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case 47:
|
|
Packit |
f574b8 |
if (51 < c2)
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
case 84:
|
|
Packit |
f574b8 |
if (6 < c2)
|
|
Packit |
f574b8 |
return 0;
|
|
Packit |
f574b8 |
break;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
return 1;
|
|
Packit |
f574b8 |
}
|