diff --git a/apps/webbrowser/html-strings b/apps/webbrowser/html-strings
index e56d8f600..e319dc651 100644
--- a/apps/webbrowser/html-strings
+++ b/apps/webbrowser/html-strings
@@ -9,7 +9,6 @@ html_a "a\0"
html_body "body\0"
html_br "br\0"
html_form "form\0"
-html_frame "frame\0"
html_h1 "h1\0"
html_h2 "h2\0"
html_h3 "h3\0"
diff --git a/apps/webbrowser/html-strings.c b/apps/webbrowser/html-strings.c
index 51fc3f1cd..5743f1a03 100644
--- a/apps/webbrowser/html-strings.c
+++ b/apps/webbrowser/html-strings.c
@@ -31,9 +31,6 @@ const char html_br[4] =
const char html_form[6] =
/* "form\0" */
{0x66, 0x6f, 0x72, 0x6d, 00, };
-const char html_frame[7] =
-/* "frame\0" */
-{0x66, 0x72, 0x61, 0x6d, 0x65, 00, };
const char html_h1[4] =
/* "h1\0" */
{0x68, 0x31, 00, };
diff --git a/apps/webbrowser/html-strings.h b/apps/webbrowser/html-strings.h
index cf09c0107..5bcf03978 100644
--- a/apps/webbrowser/html-strings.h
+++ b/apps/webbrowser/html-strings.h
@@ -9,7 +9,6 @@ extern const char html_a[3];
extern const char html_body[6];
extern const char html_br[4];
extern const char html_form[6];
-extern const char html_frame[7];
extern const char html_h1[4];
extern const char html_h2[4];
extern const char html_h3[4];
diff --git a/apps/webbrowser/htmlparser.c b/apps/webbrowser/htmlparser.c
index 725aae433..5e606d08e 100644
--- a/apps/webbrowser/htmlparser.c
+++ b/apps/webbrowser/htmlparser.c
@@ -119,9 +119,6 @@ G * (
,
, ), the tag (but does not even try to
#define ISO_eq 0x3d
#define ISO_gt 0x3e
-#define ISO_rbrack 0x5b
-#define ISO_lbrack 0x5d
-
#define MINORSTATE_NONE 0
#define MINORSTATE_TEXT 1 /* Parse normal text */
#define MINORSTATE_EXTCHAR 2 /* Check for semi-colon */
@@ -140,7 +137,7 @@ G * (
, , ), the tag (but does not even try to
#define MAJORSTATE_LINK 2
#define MAJORSTATE_FORM 3
#define MAJORSTATE_DISCARD 4
-
+#define MAJORSTATE_SCRIPT 5
struct htmlparser_state {
@@ -151,7 +148,7 @@ struct htmlparser_state {
unsigned char tagattrptr;
char tagattrparam[WWW_CONF_MAX_URLLEN + 1];
unsigned char tagattrparamptr;
- unsigned char lastchar, quotechar;
+ unsigned char quotechar;
unsigned char majorstate, lastmajorstate;
char linkurl[WWW_CONF_MAX_URLLEN + 1];
@@ -196,33 +193,31 @@ static const char *tags[] = {
html_br,
#define TAG_FORM 10
html_form,
-#define TAG_FRAME 11
- html_frame,
-#define TAG_H1 12
+#define TAG_H1 11
html_h1,
-#define TAG_H2 13
+#define TAG_H2 12
html_h2,
-#define TAG_H3 14
+#define TAG_H3 13
html_h3,
-#define TAG_H4 15
+#define TAG_H4 14
html_h4,
-#define TAG_IMG 16
+#define TAG_IMG 15
html_img,
-#define TAG_INPUT 17
+#define TAG_INPUT 16
html_input,
-#define TAG_LI 18
+#define TAG_LI 17
html_li,
-#define TAG_P 19
+#define TAG_P 18
html_p,
-#define TAG_SCRIPT 20
+#define TAG_SCRIPT 19
html_script,
-#define TAG_SELECT 21
+#define TAG_SELECT 20
html_select,
-#define TAG_STYLE 22
+#define TAG_STYLE 21
html_style,
-#define TAG_TR 23
+#define TAG_TR 22
html_tr,
-#define TAG_LAST 24
+#define TAG_LAST 23
last,
};
@@ -254,7 +249,7 @@ htmlparser_init(void)
{
s.majorstate = s.lastmajorstate = MAJORSTATE_DISCARD;
s.minorstate = MINORSTATE_TEXT;
- s.lastchar = 0;
+ s.wordlen = 0;
#if WWW_CONF_FORMS
s.formaction[0] = 0;
#endif /* WWW_CONF_FORMS */
@@ -305,10 +300,10 @@ do_word(void)
{
if(s.wordlen > 0) {
if(s.majorstate == MAJORSTATE_LINK) {
- if(s.word[s.wordlen] != ISO_space) {
+ if(s.word[s.wordlen - 1] != ISO_space) {
add_char(ISO_space);
}
- } else if(s.majorstate == MAJORSTATE_DISCARD) {
+ } else if(s.majorstate >= MAJORSTATE_DISCARD) {
s.wordlen = 0;
} else {
s.word[s.wordlen] = '\0';
@@ -368,13 +363,19 @@ static void
parse_tag(void)
{
static char *tagattrparam;
+ static unsigned char tag;
static unsigned char size;
- static char dummy;
-
+ tag = find_tag(s.tag);
+ /* If we are inside a . */
+ if(s.majorstate == MAJORSTATE_SCRIPT && tag != TAG_SLASHSCRIPT) {
+ return;
+ }
+
PRINTF(("Parsing tag '%s' '%s' '%s'\n", s.tag, s.tagattr, s.tagattrparam));
- switch(find_tag(s.tag)) {
+ switch(tag) {
case TAG_P:
case TAG_H1:
case TAG_H2:
@@ -386,15 +387,18 @@ parse_tag(void)
case TAG_TR:
case TAG_SLASHDIV:
case TAG_SLASHH:
- dummy = 0;
newline();
break;
case TAG_LI:
- newline();
- add_char(ISO_asterisk);
- add_char(ISO_space);
+ if(s.tagattr[0] == 0) {
+ newline();
+ add_char(ISO_asterisk);
+ add_char(ISO_space);
+ }
break;
case TAG_SCRIPT:
+ switch_majorstate(MAJORSTATE_SCRIPT);
+ break;
case TAG_STYLE:
case TAG_SELECT:
switch_majorstate(MAJORSTATE_DISCARD);
@@ -408,18 +412,6 @@ parse_tag(void)
case TAG_BODY:
s.majorstate = s.lastmajorstate = MAJORSTATE_BODY;
break;
- case TAG_FRAME:
- if(strncmp(s.tagattr, html_src, sizeof(html_src)) == 0 && s.tagattrparam[0] != 0) {
- switch_majorstate(MAJORSTATE_BODY);
- newline();
- add_char(ISO_rbrack);
- do_word();
- htmlparser_link((char *)html_frame, (unsigned char)strlen(html_frame), s.tagattrparam);
- PRINTF(("Frame [%s]\n", s.tagattrparam));
- add_char(ISO_lbrack);
- newline();
- }
- break;
case TAG_IMG:
if(strncmp(s.tagattr, html_alt, sizeof(html_alt)) == 0 && s.tagattrparam[0] != 0) {
add_char(ISO_lt);
@@ -572,6 +564,15 @@ parse_word(char *data, uint8_t dlen)
}
break;
case MINORSTATE_TAG:
+ /* If we are inside a we mustn't mistake a JavaScript
+ equation with a '<' as a tag. So we check for the very next
+ character to be a '/' as we're only interested in parsing
+ the . */
+ if(s.majorstate == MAJORSTATE_SCRIPT && data[0] != ISO_slash) {
+ s.minorstate = MINORSTATE_TEXT;
+ break;
+ }
+
/* We are currently parsing within the name of a tag. We check
for the end of a tag (the '>' character) or whitespace (which
indicates that we should parse a tag attr argument
diff --git a/apps/webbrowser/http-strings b/apps/webbrowser/http-strings
index 24ddb4f90..ff6a87545 100644
--- a/apps/webbrowser/http-strings
+++ b/apps/webbrowser/http-strings
@@ -1,4 +1,5 @@
http_http "http://"
+http_https "https://"
http_200 "200 "
http_301 "301 "
http_302 "302 "
@@ -10,3 +11,4 @@ http_location "location: "
http_host "Host: "
http_crnl "\r\n"
http_html ".html"
+http_redirect "Redirect to "
diff --git a/apps/webbrowser/http-strings.c b/apps/webbrowser/http-strings.c
index aa4d45ece..72ce2c644 100644
--- a/apps/webbrowser/http-strings.c
+++ b/apps/webbrowser/http-strings.c
@@ -1,6 +1,9 @@
const char http_http[8] =
/* "http://" */
{0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, };
+const char http_https[9] =
+/* "https://" */
+{0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, };
const char http_200[5] =
/* "200 " */
{0x32, 0x30, 0x30, 0x20, };
@@ -34,3 +37,6 @@ const char http_crnl[3] =
const char http_html[6] =
/* ".html" */
{0x2e, 0x68, 0x74, 0x6d, 0x6c, };
+const char http_redirect[19] =
+/* "Redirect to " */
+{0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x20, };
diff --git a/apps/webbrowser/http-strings.h b/apps/webbrowser/http-strings.h
index 8b9bee66e..184dcf330 100644
--- a/apps/webbrowser/http-strings.h
+++ b/apps/webbrowser/http-strings.h
@@ -1,4 +1,5 @@
extern const char http_http[8];
+extern const char http_https[9];
extern const char http_200[5];
extern const char http_301[5];
extern const char http_302[5];
@@ -10,3 +11,4 @@ extern const char http_location[11];
extern const char http_host[7];
extern const char http_crnl[3];
extern const char http_html[6];
+extern const char http_redirect[19];
diff --git a/apps/webbrowser/webclient.c b/apps/webbrowser/webclient.c
index 08c6ed211..5d2ce0254 100644
--- a/apps/webbrowser/webclient.c
+++ b/apps/webbrowser/webclient.c
@@ -49,7 +49,7 @@
#define HTTPFLAG_NONE 0
#define HTTPFLAG_OK 1
#define HTTPFLAG_MOVED 2
-#define HTTPFLAG_ERROR 3
+#define HTTPFLAG_HTTPS 3
#define ISO_nl 0x0a
@@ -63,11 +63,11 @@ struct webclient_state {
uint16_t port;
char host[40];
- char file[WWW_CONF_MAX_URLLEN];
+ char file[WWW_CONF_MAX_URLLEN - 10]; // URL - "http:///"
uint16_t getrequestptr;
uint16_t getrequestleft;
- char httpheaderline[200];
+ char httpheaderline[WWW_CONF_MAX_URLLEN + 10]; // URL + "Location: "
uint16_t httpheaderlineptr;
char mimetype[32];
@@ -327,13 +327,12 @@ parse_headers(uint16_t len)
char *cptr;
static unsigned char i;
- while(len > 0 && s.httpheaderlineptr < sizeof(s.httpheaderline)) {
+ while(len > 0) {
s.httpheaderline[s.httpheaderlineptr] = *(char *)uip_appdata;
uip_appdata = (char *)uip_appdata + 1;
--len;
if(s.httpheaderline[s.httpheaderlineptr] == ISO_nl) {
- /* We have an entire HTTP header line in s.httpheaderline, so
- we parse it. */
+ /* We reached the end of an HTTP header line. */
if(s.httpheaderline[0] == ISO_cr) {
/* This was the last header line (i.e., and empty "\r\n"), so
we are done with the headers and proceed with the actual
@@ -342,46 +341,53 @@ parse_headers(uint16_t len)
return len;
}
- s.httpheaderline[s.httpheaderlineptr - 1] = 0;
- /* Check for specific HTTP header fields. */
- if(casecmp(s.httpheaderline, http_content_type,
- sizeof(http_content_type) - 1) == 0) {
- /* Found Content-type field. */
- cptr = strchr(s.httpheaderline, ';');
- if(cptr != NULL) {
- *cptr = 0;
- }
- strncpy(s.mimetype, s.httpheaderline +
- sizeof(http_content_type) - 1, sizeof(s.mimetype));
- } else if(casecmp(s.httpheaderline, http_location,
- sizeof(http_location) - 1) == 0) {
- cptr = s.httpheaderline +
- sizeof(http_location) - 1;
-
- if(strncmp(cptr, http_http, 7) == 0) {
- cptr += 7;
- for(i = 0; i < s.httpheaderlineptr - 7; ++i) {
- if(*cptr == 0 ||
- *cptr == '/' ||
- *cptr == ' ' ||
- *cptr == ':') {
- s.host[i] = 0;
- break;
- }
- s.host[i] = *cptr;
- ++cptr;
+ if(s.httpheaderlineptr < sizeof(s.httpheaderline) - 1) {
+ /* We have an entire HTTP header line in s.httpheaderline, so
+ we parse it. */
+ s.httpheaderline[s.httpheaderlineptr - 1] = 0;
+ /* Check for specific HTTP header fields. */
+ if(casecmp(s.httpheaderline, http_content_type,
+ sizeof(http_content_type) - 1) == 0) {
+ /* Found Content-type field. */
+ cptr = strchr(s.httpheaderline, ';');
+ if(cptr != NULL) {
+ *cptr = 0;
}
- }
- strncpy(s.file, cptr, sizeof(s.file));
- /* s.file[s.httpheaderlineptr - i] = 0;*/
- }
+ strncpy(s.mimetype, s.httpheaderline +
+ sizeof(http_content_type) - 1, sizeof(s.mimetype));
+ } else if(casecmp(s.httpheaderline, http_location,
+ sizeof(http_location) - 1) == 0) {
+ cptr = s.httpheaderline +
+ sizeof(http_location) - 1;
+ if(strncmp(cptr, http_https, sizeof(http_https) - 1) == 0) {
+ s.httpflag = HTTPFLAG_HTTPS;
+ } else if(strncmp(cptr, http_http, 7) == 0) {
+ cptr += 7;
+ for(i = 0; i < s.httpheaderlineptr - 7; ++i) {
+ if(*cptr == 0 ||
+ *cptr == '/' ||
+ *cptr == ' ' ||
+ *cptr == ':') {
+ s.host[i] = 0;
+ break;
+ }
+ s.host[i] = *cptr;
+ ++cptr;
+ }
+ }
+ strncpy(s.file, cptr, sizeof(s.file));
+ /* s.file[s.httpheaderlineptr - i] = 0;*/
+ }
+ }
/* We're done parsing, so we reset the pointer and start the
next line. */
s.httpheaderlineptr = 0;
} else {
- ++s.httpheaderlineptr;
+ if(s.httpheaderlineptr < sizeof(s.httpheaderline) - 1) {
+ ++s.httpheaderlineptr;
+ }
}
}
return len;
@@ -403,7 +409,7 @@ newdata(void)
}
if(len > 0 && s.state == WEBCLIENT_STATE_DATA &&
- s.httpflag != HTTPFLAG_MOVED) {
+ s.httpflag == HTTPFLAG_OK) {
webclient_datahandler((char *)uip_appdata, len);
}
}
@@ -441,7 +447,6 @@ webclient_appcall(void *state)
return;
}
-
/* The acked() and newdata() functions may alter the uip_appdata
ptr, so we need to store it in the "dataptr" variable so that we
can restore it before the senddata() function is called. */
@@ -474,10 +479,18 @@ webclient_appcall(void *state)
if(uip_closed()) {
tcp_markconn(uip_conn, NULL);
- if(s.httpflag != HTTPFLAG_MOVED) {
+ switch(s.httpflag) {
+ case HTTPFLAG_HTTPS:
+ /* Send some info to the user. */
+ webclient_datahandler((char *)http_redirect, sizeof(http_redirect) - 1);
+ webclient_datahandler(s.file, strlen(s.file));
+ webclient_datahandler((char *)http_crnl, sizeof(http_crnl) - 1);
+ /* FALLTHROUGH */
+ case HTTPFLAG_OK:
/* Send NULL data to signal EOF. */
webclient_datahandler(NULL, 0);
- } else {
+ break;
+ case HTTPFLAG_MOVED:
/* conn = uip_connect(uip_conn->ripaddr, s.port);
if(conn != NULL) {
dispatcher_markconn(conn, NULL);
@@ -489,6 +502,7 @@ webclient_appcall(void *state)
}
#endif /* UIP_UDP */
webclient_get(s.host, s.port, s.file);
+ break;
}
}
}
diff --git a/apps/webbrowser/www.c b/apps/webbrowser/www.c
index 8e1331c75..3e84c7cb9 100644
--- a/apps/webbrowser/www.c
+++ b/apps/webbrowser/www.c
@@ -125,7 +125,7 @@ static struct ctk_button wgetyesbutton =
#if WWW_CONF_HISTORY_SIZE > 0
/* The char arrays that hold the history of visited URLs. */
static char history[WWW_CONF_HISTORY_SIZE][WWW_CONF_MAX_URLLEN];
-static char history_last;
+static unsigned char history_last;
#endif /* WWW_CONF_HISTORY_SIZE > 0 */
struct linkattrib {
@@ -170,17 +170,19 @@ static struct inputattrib *currptr;
#define ISO_nl 0x0a
#define ISO_space 0x20
+#define ISO_hash 0x23
#define ISO_ampersand 0x26
-#define ISO_plus 0x2b
+#define ISO_plus 0x2b
#define ISO_slash 0x2f
#define ISO_eq 0x3d
-#define ISO_questionmark 0x3f
+#define ISO_questionmark 0x3f
/* The state of the rendering code. */
static char *webpageptr;
static unsigned char x, y;
static unsigned char loading;
static unsigned short firsty, pagey;
+static unsigned char newlines;
static unsigned char count;
static char receivingmsgs[4][23] = {
@@ -194,7 +196,7 @@ PROCESS(www_process, "Web browser");
AUTOSTART_PROCESSES(&www_process);
-static void CC_FASTCALL formsubmit(struct formattrib *form);
+static void CC_FASTCALL formsubmit(struct inputattrib *trigger);
/*-----------------------------------------------------------------------------------*/
/* make_window()
@@ -277,6 +279,7 @@ start_loading(void)
loading = 1;
x = y = 0;
pagey = 0;
+ newlines = 0;
webpageptr = webpage;
clear_page();
@@ -305,10 +308,13 @@ open_url(void)
static uip_ipaddr_t addr;
/* Trim off any spaces in the end of the url. */
- urlptr = url + strlen(url) - 1;
- while(*urlptr == ' ' && urlptr > url) {
- *urlptr = 0;
- --urlptr;
+ urlptr = url + strlen(url);
+ while(urlptr > url) {
+ if(*(urlptr - 1) == ' ') {
+ *--urlptr = 0;
+ } else {
+ break;
+ }
}
/* Don't even try to go further if the URL is empty. */
@@ -376,7 +382,6 @@ open_url(void)
} else {
show_statustext("Connecting...");
}
- redraw_window();
}
/*-----------------------------------------------------------------------------------*/
/* set_link(link):
@@ -510,15 +515,17 @@ PROCESS_THREAD(www_process, ev, data)
firsty = 0;
start_loading();
--history_last;
+ /* Note: history_last is unsigned ! */
if(history_last > WWW_CONF_HISTORY_SIZE) {
history_last = WWW_CONF_HISTORY_SIZE - 1;
}
memcpy(url, history[(int)history_last], WWW_CONF_MAX_URLLEN);
+ *history[(int)history_last] = 0;
open_url();
CTK_WIDGET_FOCUS(&mainwindow, &backbutton);
#endif /* WWW_CONF_HISTORY_SIZE > 0 */
} else if(w == (struct ctk_widget *)&downbutton) {
- firsty = pagey + WWW_CONF_WEBPAGE_HEIGHT - 4;
+ firsty = pagey + WWW_CONF_WEBPAGE_HEIGHT - 2;
start_loading();
open_url();
CTK_WIDGET_FOCUS(&mainwindow, &downbutton);
@@ -557,9 +564,8 @@ PROCESS_THREAD(www_process, ev, data)
#if WWW_CONF_FORMS
} else {
/* Assume form widget. */
- struct inputattrib *input = (struct inputattrib *)
- (((char *)w) - offsetof(struct inputattrib, widget));
- formsubmit(input->formptr);
+ formsubmit((struct inputattrib *)
+ (((char *)w) - offsetof(struct inputattrib, widget)));
#endif /* WWW_CONF_FORMS */
}
} else if(ev == ctk_signal_hyperlink_activate) {
@@ -670,8 +676,6 @@ webclient_connected(void)
{
start_loading();
- clear_page();
-
show_statustext("Request sent...");
set_url(webclient_hostname(), webclient_port(), webclient_filename());
@@ -731,6 +735,8 @@ add_pagewidget(char *text, unsigned char size, char *attrib, unsigned char type,
char *wptr;
static unsigned char maxwidth;
+ newlines = 0;
+
if(!loading) {
return;
}
@@ -770,49 +776,49 @@ add_pagewidget(char *text, unsigned char size, char *attrib, unsigned char type,
wptr[size + border] = ' ';
switch(type) {
- case CTK_WIDGET_HYPERLINK: {
- struct linkattrib *linkptr =
- (struct linkattrib *)add_pageattrib(sizeof(struct linkattrib) /* incl 1 attrib char */ + attriblen);
- if(linkptr != NULL) {
- CTK_HYPERLINK_NEW(&linkptr->hyperlink, x, y + 3, size, wptr, linkptr->url);
- strcpy(linkptr->url, attrib);
- CTK_WIDGET_SET_FLAG(&linkptr->hyperlink, CTK_WIDGET_FLAG_MONOSPACE);
- CTK_WIDGET_ADD(&mainwindow, &linkptr->hyperlink);
- }
- break;
+ case CTK_WIDGET_HYPERLINK: {
+ struct linkattrib *linkptr =
+ (struct linkattrib *)add_pageattrib(sizeof(struct linkattrib) /* incl 1 attrib char */ + attriblen);
+ if(linkptr != NULL) {
+ CTK_HYPERLINK_NEW(&linkptr->hyperlink, x, y + 3, size, wptr, linkptr->url);
+ strcpy(linkptr->url, attrib);
+ CTK_WIDGET_SET_FLAG(&linkptr->hyperlink, CTK_WIDGET_FLAG_MONOSPACE);
+ CTK_WIDGET_ADD(&mainwindow, &linkptr->hyperlink);
}
+ break;
+ }
#if WWW_CONF_FORMS
- case CTK_WIDGET_BUTTON: {
- struct submitattrib *submitptr =
- (struct submitattrib *)add_pageattrib(sizeof(struct submitattrib) /* incl 1 attrib char */ + attriblen);
- if(submitptr != NULL) {
- CTK_BUTTON_NEW((struct ctk_button *)&submitptr->button, x, y + 3, size, wptr);
- add_forminput((struct inputattrib *)submitptr);
- submitptr->formptr = formptr;
- strcpy(submitptr->name, attrib);
- CTK_WIDGET_SET_FLAG(&submitptr->button, CTK_WIDGET_FLAG_MONOSPACE);
- CTK_WIDGET_ADD(&mainwindow, &submitptr->button);
- }
- break;
+ case CTK_WIDGET_BUTTON: {
+ struct submitattrib *submitptr =
+ (struct submitattrib *)add_pageattrib(sizeof(struct submitattrib) /* incl 1 attrib char */ + attriblen);
+ if(submitptr != NULL) {
+ CTK_BUTTON_NEW((struct ctk_button *)&submitptr->button, x, y + 3, size, wptr);
+ add_forminput((struct inputattrib *)submitptr);
+ submitptr->formptr = formptr;
+ strcpy(submitptr->name, attrib);
+ CTK_WIDGET_SET_FLAG(&submitptr->button, CTK_WIDGET_FLAG_MONOSPACE);
+ CTK_WIDGET_ADD(&mainwindow, &submitptr->button);
}
- case CTK_WIDGET_TEXTENTRY: {
- struct textattrib *textptr =
- (struct textattrib *)add_pageattrib(sizeof(struct textattrib) /* incl 1 attrib char */ + attriblen
- + (size ? WWW_CONF_MAX_INPUTVALUELEN : strlen(text)) + 1);
- if(textptr != NULL) {
- CTK_TEXTENTRY_NEW((struct ctk_textentry *)&textptr->textentry, x, y + 3, size, 1,
- textptr->name + attriblen + 1, WWW_CONF_MAX_INPUTVALUELEN);
- add_forminput((struct inputattrib *)textptr);
- textptr->formptr = formptr;
- strcpy(textptr->textentry.text, text);
- strcpy(textptr->name, attrib);
- if(size) {
- CTK_WIDGET_SET_FLAG(&textptr->textentry, CTK_WIDGET_FLAG_MONOSPACE);
- CTK_WIDGET_ADD(&mainwindow, &textptr->textentry);
- }
+ break;
+ }
+ case CTK_WIDGET_TEXTENTRY: {
+ struct textattrib *textptr =
+ (struct textattrib *)add_pageattrib(sizeof(struct textattrib) /* incl 1 attrib char */ + attriblen
+ + (size ? WWW_CONF_MAX_INPUTVALUELEN : strlen(text)) + 1);
+ if(textptr != NULL) {
+ CTK_TEXTENTRY_NEW((struct ctk_textentry *)&textptr->textentry, x, y + 3, size, 1,
+ textptr->name + attriblen + 1, WWW_CONF_MAX_INPUTVALUELEN);
+ add_forminput((struct inputattrib *)textptr);
+ textptr->formptr = formptr;
+ strcpy(textptr->textentry.text, text);
+ strcpy(textptr->name, attrib);
+ if(size) {
+ CTK_WIDGET_SET_FLAG(&textptr->textentry, CTK_WIDGET_FLAG_MONOSPACE);
+ CTK_WIDGET_ADD(&mainwindow, &textptr->textentry);
}
- break;
}
+ break;
+ }
#endif /* WWW_CONF_FORMS */
}
}
@@ -837,6 +843,10 @@ htmlparser_newline(void)
{
char *wptr;
+ if(++newlines > 2) {
+ return;
+ }
+
if(pagey < firsty) {
++pagey;
x = 0;
@@ -863,6 +873,8 @@ htmlparser_newline(void)
void
htmlparser_word(char *word, unsigned char wordlen)
{
+ newlines = 0;
+
if(loading) {
if(wordlen + 1 > WWW_CONF_WEBPAGE_WIDTH - x) {
htmlparser_newline();
@@ -886,7 +898,12 @@ htmlparser_word(char *word, unsigned char wordlen)
void
htmlparser_link(char *text, unsigned char textlen, char *url)
{
- add_pagewidget(text, textlen, url, CTK_WIDGET_HYPERLINK, 0);
+ /* No link for https or fragment-only as we would't be able to handle it anyway. */
+ if(url[0] == ISO_hash || strncmp(url, http_https, sizeof(http_https) - 1) == 0) {
+ htmlparser_word(text, textlen);
+ } else {
+ add_pagewidget(text, textlen, url, CTK_WIDGET_HYPERLINK, 0);
+ }
}
/*-----------------------------------------------------------------------------------*/
#if WWW_CONF_FORMS
@@ -946,23 +963,36 @@ add_query(char delimiter, char *string)
}
/*-----------------------------------------------------------------------------------*/
static void CC_FASTCALL
-formsubmit(struct formattrib *form)
+formsubmit(struct inputattrib *trigger)
{
- struct inputattrib *inputptr;
+ struct inputattrib *input;
+ struct formattrib *form = trigger->formptr;
char delimiter = ISO_questionmark;
set_link(form->action);
- for(inputptr = form->nextptr; inputptr != NULL; inputptr = inputptr->nextptr) {
+ /* No button pressed so prepare to look for default button. */
+ if(trigger->widget.type == CTK_WIDGET_TEXTENTRY) {
+ trigger = NULL;
+ }
+
+ for(input = form->nextptr; input != NULL; input = input->nextptr) {
char *name;
char *value;
- if(inputptr->widget.type == CTK_WIDGET_BUTTON) {
- name = ((struct submitattrib *)inputptr)->name;
- value = ((struct submitattrib *)inputptr)->button.text;
+ if(input->widget.type == CTK_WIDGET_TEXTENTRY) {
+ name = ((struct textattrib *)input)->name;
+ value = ((struct textattrib *)input)->textentry.text;
} else {
- name = ((struct textattrib *)inputptr)->name;
- value = ((struct textattrib *)inputptr)->textentry.text;
+ /* Consider first button as default button. */
+ if(trigger == NULL) {
+ trigger = input;
+ }
+ if(input != trigger) {
+ continue;
+ }
+ name = ((struct submitattrib *)input)->name;
+ value = ((struct submitattrib *)input)->button.text;
}
add_query(delimiter, name);
diff --git a/apps/webbrowser/www.h b/apps/webbrowser/www.h
index d7ffd6fd6..2b6e5f33e 100644
--- a/apps/webbrowser/www.h
+++ b/apps/webbrowser/www.h
@@ -44,7 +44,7 @@
#define WWW_CONF_HISTORY_SIZE 10
#endif
#ifndef WWW_CONF_MAX_URLLEN
-#define WWW_CONF_MAX_URLLEN 300
+#define WWW_CONF_MAX_URLLEN 255
#endif
#ifndef WWW_CONF_PAGEATTRIB_SIZE
#define WWW_CONF_PAGEATTRIB_SIZE 2000
diff --git a/apps/webserver/http-strings b/apps/webserver/http-strings
index 4178cae2f..07d4eac8c 100644
--- a/apps/webserver/http-strings
+++ b/apps/webserver/http-strings
@@ -1,4 +1,5 @@
http_http "http://"
+http_https "https://"
http_200 "200 "
http_301 "301 "
http_302 "302 "
@@ -32,4 +33,4 @@ http_gif ".gif"
http_jpg ".jpg"
http_text ".text"
http_txt ".txt"
-
+http_redirect "Redirect to "
diff --git a/apps/webserver/http-strings.c b/apps/webserver/http-strings.c
index f1c55e621..40667d24c 100644
--- a/apps/webserver/http-strings.c
+++ b/apps/webserver/http-strings.c
@@ -1,6 +1,9 @@
const char http_http[8] =
/* "http://" */
{0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, };
+const char http_https[9] =
+/* "https://" */
+{0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, };
const char http_200[5] =
/* "200 " */
{0x32, 0x30, 0x30, 0x20, };
@@ -100,3 +103,6 @@ const char http_text[6] =
const char http_txt[5] =
/* ".txt" */
{0x2e, 0x74, 0x78, 0x74, };
+const char http_redirect[19] =
+/* "Redirect to " */
+{0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x20, };
diff --git a/apps/webserver/http-strings.h b/apps/webserver/http-strings.h
index 01fc8cd9d..58ae13be8 100644
--- a/apps/webserver/http-strings.h
+++ b/apps/webserver/http-strings.h
@@ -1,4 +1,5 @@
extern const char http_http[8];
+extern const char http_https[9];
extern const char http_200[5];
extern const char http_301[5];
extern const char http_302[5];
@@ -32,3 +33,4 @@ extern const char http_gif[5];
extern const char http_jpg[5];
extern const char http_text[6];
extern const char http_txt[5];
+extern const char http_redirect[19];
diff --git a/cpu/6502/6502def.h b/cpu/6502/6502def.h
index 1d7b5c440..441768153 100644
--- a/cpu/6502/6502def.h
+++ b/cpu/6502/6502def.h
@@ -72,7 +72,6 @@ typedef unsigned short uip_stats_t;
#define UIP_CONF_LLH_LEN 14
#define RESOLV_CONF_SUPPORTS_MDNS 0
#define RESOLV_CONF_SUPPORTS_RECORD_EXPIRATION 0
-#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 1
#define LOADER_CONF_ARCH "lib/unload.h"
diff --git a/platform/win32/contiki-conf.h b/platform/win32/contiki-conf.h
index 9c2e81be7..0441bebd9 100644
--- a/platform/win32/contiki-conf.h
+++ b/platform/win32/contiki-conf.h
@@ -56,11 +56,8 @@ typedef long s32_t;
typedef unsigned short uip_stats_t;
-#define UIP_CONF_MAX_CONNECTIONS 40
-#define UIP_CONF_MAX_LISTENPORTS 40
#define UIP_CONF_LLH_LEN 14
#define UIP_CONF_BUFFER_SIZE 1514
-#define UIP_CONF_BYTE_ORDER UIP_LITTLE_ENDIAN
#define UIP_CONF_TCP_SPLIT 1
#define UIP_CONF_LOGGING 1
#define UIP_CONF_UDP_CHECKSUMS 1
@@ -77,6 +74,8 @@ typedef unsigned short uip_stats_t;
#define UIP_CONF_IP_FORWARD 1
#endif
+#define RESOLV_CONF_SUPPORTS_MDNS 0
+#define RESOLV_CONF_SUPPORTS_RECORD_EXPIRATION 0
#include
#define ctk_arch_isprint isprint