void free_url(void *U)
{
urlcontent *u = (urlcontent*) U;
- free(u->url_data);
+ FreeStrBuf(&u->url_data);
free(u);
}
/*
* Extract variables from the URL.
*/
-void addurls(char *url, long ulen)
+void addurls(StrBuf *url)
{
- char *aptr, *bptr, *eptr;
- char *up;
- char *buf;
+ const char *aptr, *bptr, *eptr, *up;
+/// char *buf;
int len, keylen;
urlcontent *u;
struct wcsession *WCC = WC;
if (WCC->urlstrings == NULL)
WCC->urlstrings = NewHash(1, NULL);
- buf = (char*) malloc (ulen + 1);
- memcpy(buf, url, ulen);
- buf[ulen] = '\0';
- eptr = buf + ulen;
- up = buf;
+// buf = (char*) malloc (ulen + 1);
+// memcpy(buf, url, ulen);
+/// buf[ulen] = '\0';
+ eptr = ChrPtr(url) + StrLength(url);
+ up = ChrPtr(url);
while ((up < eptr) && (!IsEmptyStr(up))) {
aptr = up;
while ((aptr < eptr) && (*aptr != '\0') && (*aptr != '='))
aptr++;
if (*aptr != '=') {
- free(buf);
+ ///free(buf);
return;
}
- *aptr = '\0';
+ ///*aptr = '\0';
aptr++;
bptr = aptr;
while ((bptr < eptr) && (*bptr != '\0')
&& (*bptr != '&') && (*bptr != '?') && (*bptr != ' ')) {
bptr++;
}
- *bptr = '\0';
- u = (urlcontent *) malloc(sizeof(urlcontent));
+ //*bptr = '\0';
+ keylen = aptr - up - 1; /* -1 -> '=' */
+ if(keylen > sizeof(u->url_key)) {
+ lprintf(1, "URLkey to long! [%s]", up);
+ continue;
+ }
- keylen = safestrncpy(u->url_key, up, sizeof u->url_key);
- if (keylen < 0){
+ u = (urlcontent *) malloc(sizeof(urlcontent));
+ memcpy(u->url_key, up, keylen);
+ u->url_key[keylen] = '\0';
+ if (keylen < 0) {
lprintf(1, "URLkey to long! [%s]", up);
+ free(u);
continue;
}
Put(WCC->urlstrings, u->url_key, keylen, u, free_url);
len = bptr - aptr;
- u->url_data = malloc(len + 2);
- safestrncpy(u->url_data, aptr, len + 2);
- u->url_data_size = unescape_input(u->url_data);
- u->url_data[u->url_data_size] = '\0';
+ u->url_data = NewStrBufPlain(aptr, len);
+ StrBufUnescape(u->url_data, 1);
+
up = bptr;
++up;
#ifdef DEBUG_URLSTRINGS
- lprintf(9, "%s = [%ld] %s\n", u->url_key, u->url_data_size, u->url_data);
+ lprintf(9, "%s = [%ld] %s\n", u->url_key, u->url_data_size, ChrPtr(u->url_data));
#endif
}
- free(buf);
+ //free(buf);
}
/*
Cursor = GetNewHashPos ();
while (GetNextHashPos(WCC->urlstrings, Cursor, &HKLen, &HKey, &U)) {
u = (urlcontent*) U;
- wprintf("%38s = %s\n", u->url_key, u->url_data);
+ wprintf("%38s = %s\n", u->url_key, ChrPtr(u->url_data));
}
}
if ((WC->urlstrings != NULL) &&
GetHash(WC->urlstrings, key, keylen, &U)) {
- *len = ((urlcontent *)U)->url_data_size;
- return ((urlcontent *)U)->url_data;
+ *len = StrLength(((urlcontent *)U)->url_data);
+ return ChrPtr(((urlcontent *)U)->url_data);
}
else {
*len = 0;
if ((WC->urlstrings != NULL) &&
GetHash(WC->urlstrings, key, strlen (key), &U)){
- *len = ((urlcontent *)U)->url_data_size;
- return ((urlcontent *)U)->url_data;
+ *len = StrLength(((urlcontent *)U)->url_data);
+ return ChrPtr(((urlcontent *)U)->url_data);
}
else {
*len = 0;
if ((WC->urlstrings != NULL) &&
GetHash(WC->urlstrings, key, strlen (key), &U))
- return ((urlcontent *)U)->url_data;
+ return ChrPtr(((urlcontent *)U)->url_data);
else
return ("");
}
if ((WC->urlstrings != NULL) &&
GetHash(WC->urlstrings, key, keylen, &U))
- return ((urlcontent *)U)->url_data;
+ return ChrPtr(((urlcontent *)U)->url_data);
else
return ("");
}
+const StrBuf *SBSTR(const char *key)
+{
+ void *U;
+
+ if ((WC->urlstrings != NULL) &&
+ GetHash(WC->urlstrings, key, strlen (key), &U))
+ return ((urlcontent *)U)->url_data;
+ else
+ return NULL;
+}
+
+const StrBuf *SBstr(const char *key, size_t keylen)
+{
+ void *U;
+
+ if ((WC->urlstrings != NULL) &&
+ GetHash(WC->urlstrings, key, keylen, &U))
+ return ((urlcontent *)U)->url_data;
+ else
+ return NULL;
+}
+
long LBstr(char *key, size_t keylen)
{
void *U;
if ((WC->urlstrings != NULL) &&
GetHash(WC->urlstrings, key, keylen, &U))
- return atol(((urlcontent *)U)->url_data);
+ return StrTol(((urlcontent *)U)->url_data);
else
return (0);
}
if ((WC->urlstrings != NULL) &&
GetHash(WC->urlstrings, key, strlen(key), &U))
- return atol(((urlcontent *)U)->url_data);
+ return StrTol(((urlcontent *)U)->url_data);
else
return (0);
}
if ((WC->urlstrings != NULL) &&
GetHash(WC->urlstrings, key, keylen, &U))
- return atoi(((urlcontent *)U)->url_data);
+ return StrTol(((urlcontent *)U)->url_data);
else
return (0);
}
if ((WC->urlstrings != NULL) &&
GetHash(WC->urlstrings, key, strlen(key), &U))
- return atoi(((urlcontent *)U)->url_data);
+ return StrToi(((urlcontent *)U)->url_data);
else
return (0);
}
if ((WC->urlstrings != NULL) &&
GetHash(WC->urlstrings, key, keylen, &U))
- return ((urlcontent *)U)->url_data_size != 0;
+ return (StrLength(((urlcontent *)U)->url_data) != 0);
else
return (0);
}
if ((WC->urlstrings != NULL) &&
GetHash(WC->urlstrings, key, strlen(key), &U))
- return ((urlcontent *)U)->url_data_size != 0;
+ return (StrLength(((urlcontent *)U)->url_data) != 0);
else
return (0);
}
if ((WC->urlstrings != NULL) &&
GetHash(WC->urlstrings, key, keylen, &U))
- return strcmp( ((urlcontent *)U)->url_data, "yes") == 0;
+ return strcmp( ChrPtr(((urlcontent *)U)->url_data), "yes") == 0;
else
return (0);
}
if ((WC->urlstrings != NULL) &&
GetHash(WC->urlstrings, key, strlen(key), &U))
- return strcmp( ((urlcontent *)U)->url_data, "yes") == 0;
+ return strcmp( ChrPtr(((urlcontent *)U)->url_data), "yes") == 0;
else
return (0);
}
{
if (print_standard_html_footer) {
wprintf("</div>\n"); /* end of "text" div */
- do_template("trailing");
+ do_template("trailing", NULL);
}
/* If we've been saving it all up for one big output burst,
urlesc(outbuf, SIZ, strbuf);
wprintf("%s", outbuf);
}
+/**
+ * urlescape buffer and print it as header
+ */
+void hurlescputs(char *strbuf) {
+ char outbuf[SIZ];
+
+ urlesc(outbuf, SIZ, strbuf);
+ hprintf("%s", outbuf);
+}
/*
"<link href=\"static.local/webcit.css\" rel=\"stylesheet\" type=\"text/css\">"
);
}
- do_template("head");
+ do_template("head", NULL);
}
/* ICONBAR */
long i;
svput("BOXTITLE", WCS_STRING, Title);
- do_template("beginbox");
+ do_template("beginbox", NULL);
wprintf("<ul class=\"%s\">", Class);
wprintf("</ul>");
- do_template("endbox");
+ do_template("endbox", NULL);
}
* A template has been requested
*/
void url_do_template(void) {
- do_template(bstr("template"));
+ do_template(bstr("template"), NULL);
}
set_preference("startpage", NewStrBufPlain(bstr("startpage"), -1), 1);
output_headers(1, 1, 0, 0, 0, 0);
- do_template("newstartpage");
+ do_template("newstartpage", NULL);
wDumpContent(1);
}
u = (urlcontent *) malloc(sizeof(urlcontent));
safestrncpy(u->url_key, name, sizeof(u->url_key));
- u->url_data = malloc(length + 1);
- u->url_data_size = length;
- memcpy(u->url_data, content, length);
- u->url_data[length] = 0;
+ u->url_data = NewStrBufPlain(content, length);
+
Put(WC->urlstrings, u->url_key, strlen(u->url_key), u, free_url);
#ifdef DEBUG_URLSTRINGS
lprintf(9, "Key: <%s> len: [%ld] Data: <%s>\n", u->url_key, u->url_data_size, u->url_data);
* \brief Detects a 'mobile' user agent
*/
int is_mobile_ua(char *user_agent) {
- if (strstr(user_agent,"iPhone OS") != NULL) {
- return 1;
- } else if (strstr(user_agent,"Windows CE") != NULL) {
- return 1;
- } else if (strstr(user_agent,"SymbianOS") != NULL) {
- return 1;
- }
- return 0;
+ if (strstr(user_agent,"iPhone OS") != NULL) {
+ return 1;
+ } else if (strstr(user_agent,"Windows CE") != NULL) {
+ return 1;
+ } else if (strstr(user_agent,"SymbianOS") != NULL) {
+ return 1;
+ } else if (strstr(user_agent, "Opera Mobi") != NULL) {
+ return 1;
+ } else if (strstr(user_agent, "Firefox/2.0.0 Opera 9.51 Beta") != NULL) {
+ // For some reason a new install of Opera 9.51beta decided to spoof.
+ return 1;
+ }
+ return 0;
}
}
else if (!strncasecmp(buf, "User-agent: ", 12)) {
safestrncpy(user_agent, &buf[12], sizeof user_agent);
+ #ifdef TECH_PREVIEW
if (is_mobile_ua(&buf[12])) {
WCC->is_mobile = 1;
}
+ #endif
}
else if (!strncasecmp(buf, "X-Forwarded-Host: ", 18)) {
if (follow_xff) {
client_read(WCC->http_sock, &content[body_start], ContentLength);
if (!strncasecmp(ContentType, "application/x-www-form-urlencoded", 33)) {
- addurls(&content[body_start], ContentLength);
+ StrBuf *Content;
+
+ Content = _NewConstStrBuf(&content[body_start],ContentLength);
+ addurls(Content);
+ FreeStrBuf(&Content);
} else if (!strncasecmp(ContentType, "multipart", 9)) {
content_end = content + ContentLength + body_start;
mime_parser(content, content_end, *upload_handler, NULL, NULL, NULL, 0);
len = strlen(cmd);
for (a = 0; a < len; ++a) {
if ((cmd[a] == '?') || (cmd[a] == '&')) {
+ StrBuf *Params;
for (b = a; b < len; ++b) {
if (isspace(cmd[b])){
cmd[b] = 0;
len = b - 1;
}
}
- addurls(&cmd[a + 1], len - a);
+ //cmd[len - a] = '\0';
+ Params = _NewConstStrBuf(&cmd[a + 1], len - a);
+ addurls(Params);
cmd[a] = 0;
len = a - 1;
}