CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

html form parameter processing

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
poyns



Joined: 03 Jul 2006
Posts: 5

View user's profile Send private message

html form parameter processing
PostPosted: Sat Mar 03, 2007 3:24 am     Reply with quote

Hi

I’m trying to implement a simple logon page (username and password fields) then forward to a settings page, using the embedded internet development board.

My understanding of HTTP_Task() (through StackTask()) is that all the parameters of a HTML form are passed through the callback function http_exec_cgi() before the function http_get_page() serves the requested web page. But even the simple web server (ex15.c) supplied with the kit serves the page before parsing the form fields. (I changed the printf's in the example slightly to make the problem more presentable)

My question: is there any way to ensure all parameters are processed before returning or forwarding to another page ie ensure http_get_page() occurs after http_exec_cgi() is done.

I expected the output from ex15.c to be:

[typed the boards ip into ie6, requesting INDEX_PAGE]
http_get_page(): request for '/' (FILE=856)

[fields passing through cgi fn]
http_exec_cgi(): FILE=856 KEY='lcd' VAL='hello there!'
http_exec_cgi(): FILE=856 KEY='led1' VAL='1'
http_exec_cgi(): FILE=856 KEY='led2' VAL='1'

[returning to the orignal page from the submit button]
http_get_page(): request for '/' (FILE=856)

Actual output from ex15.c is

[typed the boards ip into ie6, requesting INDEX_PAGE]
http_get_page(): request for '/' (FILE=856)

[returning to the page from the submit before params parse!]
http_get_page(): request for '/' (FILE=856)

[fields passing through cgi fn]
http_exec_cgi(): FILE=856 KEY='lcd' VAL='hello there!'
http_exec_cgi(): FILE=856 KEY='led1' VAL='1'
http_exec_cgi(): FILE=856 KEY='led2' VAL='1'

I would greatly appreciate any advice and thanks in advance.

Regards,
Seamus


//////////////////////////////////////////////////////////////////////////////
//
// ex15.c - Example 15 from the Embedded Internet/Embedded Ethernet tutorial
//
// A webserver that accepts GET and POST commands.
//
// NOTE: Change the code in IPAddrInit() to your desired IP address, which
// is based on your network.
//
//////////////////////////////////////////////////////////////////////////////

#define STACK_USE_ICMP 1
#define STACK_USE_ARP 1
#define STACK_USE_TCP 1
#define STACK_USE_HTTP 1
#include "ccstcpip.h"

#if STACK_USE_CCS_PICENS
#include "drivers\mlcd.c"
#else
#include "drivers\dlcd.c"
#endif

//here is this examples / page
const char HTML_INDEX_PAGE[]="
<HTML><BODY BGCOLOR=#FFFFFF TEXT=#000000>
<IMG SRC=\"http://www.ccsinfo.com/pix/CCSlogotiny.gif\"><P>
<H1>CCS HTTP/CGI EXAMPLE</H1>
<FORM METHOD=GET>
<P>LCD: <INPUT TYPE=\"text\" NAME=\"lcd\" size=20 maxlength=16>
<BR>LED1:<INPUT type=\"radio\" name=\"led1\" value=1>ON &nbsp; &nbsp; &nbsp;
<INPUT type=\"radio\" name=\"led1\" value=0 checked>OFF
<BR>LED2:<INPUT type=\"radio\" name=\"led2\" value=1>ON &nbsp; &nbsp; &nbsp;
<INPUT type=\"radio\" name=\"led2\" value=0 checked>OFF
<BR><INPUT TYPE=\"submit\"></FORM>
<P><A HREF=\"/analog\">Analog Readings</A>
</BODY></HTML>
";

const char HTML_ANALOG_PAGE[]="
<HTML><BODY BGCOLOR=#FFFFFF TEXT=#000000>
<IMG SRC=\"http://www.ccsinfo.com/pix/CCSlogotiny.gif\">
<H1>PICNET ADC READINGS</H1>
<P>%0
<BR>%1
<P><A HREF=\"/\">Change LCD/LEDs</A>
</BODY></HTML>
";

//this is a callback function to the HTTP stack. see http.c
//this demo provides to web "pages", an index (/) and an about page (/about)
int32 http_get_page(char *file_str) {
int32 file_loc=0;
static char index[]="/";
static char about[]="/analog";

printf("\nhttp_get_page(): request for '%s' ",file_str);

if (stricmp(file_str,index)==0)
file_loc=label_address(HTML_INDEX_PAGE);

else if (stricmp(file_str,about)==0)
file_loc=label_address(HTML_ANALOG_PAGE);

if (file_loc)
printf("(FILE=%LU)\n",file_loc);
else
printf("(File Not Found)\n");

return(file_loc);
}

//this is a callback function to the HTTP stack. see http.c
// this demo provides handling for two formatting chars, %0 and %1.
// %0 is ADC for channel 0, %1 is ADC for channel 1.
int8 http_format_char(int32 file, char id, char *str, int8 max_ret) {
char new_str[20];
int8 len=0;
int8 i;

*str=0;

switch(id) {
case '0':
set_adc_channel(0);
delay_us(100);
i=read_adc();
sprintf(new_str,"<B>AN0 = </B>0x%X",i);
len=strlen(new_str);
break;

case '1':
#if STACK_USE_CCS_PICNET
set_adc_channel(1);
delay_us(100);
i=read_adc();
sprintf(new_str,"<B>AN1 = </B>0x%X",i);
len=strlen(new_str);
#else
len=0;
#endif
break;

}

if (len) {
if (len>max_ret) {len=max_ret;}
memcpy(str,new_str,len);
}

return(len);
}

//this is a callback function to the HTTP stack. see http.c
//in this example it verifies that "pwd" is "master", if it is
//then it sets led1 and led2 ("led1" and "led2") based on their value
//and changes the lcd screen ("lcd").
void http_exec_cgi(int32 file, char *key, char *val) {
static char led1_key[]="led1";
static char led2_key[]="led2";
static char lcd_key[]="lcd";
int8 v;

printf("\nhttp_exec_cgi(): FILE=%LD KEY='%S' VAL='%S'", file, key, val);

if (stricmp(key,led1_key)==0) {
v=atoi(val);
if (v) {output_low(USER_LED1);}
else {output_high(USER_LED1);}
}

if (stricmp(key,led2_key)==0) {
v=atoi(val);
if (v) {output_low(USER_LED2);}
else {output_high(USER_LED2);}
}

if (stricmp(key,lcd_key)==0) {
printf(lcd_putc,"\f%s",val);
}
}

void main(void) {
MACAddrInit();
IPAddrDefault();

init_user_io();

lcd_init();

printf(lcd_putc,"\fCCS CGI Example\nWaiting");
printf("\r\n\nCCS CGI Example\r\nWaiting");

set_adc_channel(0);

StackInit();

while(TRUE) {
StackTask();
}
}
Milan
Guest







PostPosted: Wed Nov 07, 2007 4:07 am     Reply with quote

I do have the same problem, is there any solution yet? Does anyone have an idea on how to parse the fields before a new page is supplied? Confused
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group