libwebserver examples



Hello World

used functions:
web_server_init
web_server_addhandler
web_server_run

This example starts the server with one handler for all requests pointing to hello_world() that prints the content-type with the end of the header "\r\n\r\n" and one simple printf with Hello world

#include "web_server.h"
#include <stdio.h>


void hello_world() {
	printf("Content-type: text/plain\r\n\r\n");
	printf("Hello, World!\r\n");
}

int main(int argc,char** argv) {
        struct web_server server; // server handler
        if(!web_server_init(&server,80,"help.log",0)) { // initialize and start the server at port 80, logging to help.log
                fprintf(stderr,"can't open listen socket\n");
		return 1;
        };

        web_server_addhandler(&server,"* *",hello_world,0); // add handler for all requests
        while(1) {
                web_server_run(&server);   // run server
        };
}


logfile

used functions:
web_server_init
web_server_addhandler
web_server_run
web_client_addfile

This example uses the function web_client_addfile to send a file to client

#include "web_server.h"
#include <stdio.h>

void logfile() {
        printf("Content-type: text/plain\r\n\r\n");
        web_client_addfile(server.logfile); // add help.log file to output
        printf("End of log\n");
};
        

main() {
        struct web_server server; // server handler
        if(!web_server_init(&server,82,"help.log",0)) { // initializate
                fprintf(stderr,"can't open listen socket\n");
        };

        web_server_addhandler(&server,"* /log",logfile,0); // add handler for http://host/log requests
        while(1) {
                web_server_run(&server);   // run server
        };
};


Image Uploader

used functions:
web_server_init
web_server_addhandler
web_server_run
ClientInfo

This example uses the struct ClientInfo for fetching the input from the client using the Query("img") to send the image
and multipart for fetching the uploaded file


#include "web_server.h"
                
#include <stdlib.h>
        
struct image {
	char *data;
	size_t size;
} image={NULL,0};

void imageout() {
	if(strlen(ClientInfo->Query("img"))) {
		if(image.data!=NULL) {
			printf("Content-type: image/jpeg\r\n\r\n");
			fwrite(image.data,image.size,1,stdout);
		};
		return;
	};
	printf("Content-type: text/html\r\n\r\n");
	printf("<HTML>\n");
	printf("<BODY bgcolor='EFEFEF'>\n");        
	printf("<form action='/' enctype='multipart/form-data'>\n");
	printf("<input type=file name=image><BR>\n");
	printf("</form>\n");
	if(strlen(ClientInfo->MultiPart("image").data)) {
		printf("%s<BR><img src='/?img=%s.jpg'>\n",ClientInfo->MultiPart("image").filename,ClientInfo->MultiPart("image").filename);
		free(image.data);
		image.data=malloc(ClientInfo->MultiPart("image").size+1);
		memcpy(image.data,ClientInfo->MultiPart("image").data,ClientInfo->MultiPart("image").size);
		image.size=ClientInfo->MultiPart("image").size;
	}else {
		free(image.data);
		image.data=NULL;
	};
	printf("</BODY>\n");
	printf("</HTML>\n");
};



main() {
	struct web_server server;
	if(!web_server_init(&server,80,"teste.log",0)) {
		fprintf(stderr,"can't open listen socket\n");
	};
	web_server_addhandler(&server,"* /",imageout,0);
	while(1) {
		web_server_run(&server);
	};
};


Authentication

used functions:
web_server_init
web_server_addhandler
web_server_run
web_client_HTTPdirective

Here we're using the web_client_HTTPdirective to set up the server response

user: "username", pass: "password"
#include "web_server.h"
#include <stdio.h>
#include <string.h>


void urlauthenticate() {
        if(!strlen(ClientInfo->user) || !strlen(ClientInfo->pass) &&
            strcmp(ClientInfo->user,"username") || strcmp(ClientInfo->pass,"password")) { // you can read things from a auth file
                web_client_HTTPdirective("HTTP/1.1 401 Authorization Required");
                printf("WWW-Authenticate: Basic realm=\"This site info\"\r\n");
                printf("Content-type: text/html\r\n\r\n");
                printf("<BODY>\n");
                printf("<font color='FF0000'>Access denied</font>\n");
                printf("</BODY>\n");
                return;
        }
        printf("Content-type: text/html\r\n\r\n");         
        printf("<BODY bgcolor='EFEFEF'>\n");        
        printf("You entered in your area\n");
        printf("</BODY></HTML>\n");
};


main() {
        struct web_server server; // server handler
        if(!web_server_init(&server,83,"help.log",0)) { // initialize
                fprintf(stderr,"can't open listen socket\n");
        };

        web_server_addhandler(&server,"* /auth",urlauthenticate,0);
        while(1) {
                web_server_run(&server);   // run server
        };
};


openssl for (https)

used functions:
web_server_useSSLcert
web_server_init
web_server_run

Here we setup a server and we use the web_server_useSSLcert to use specific certificate file and we start the server with the flag WS_USESSL for secure connections (libwebserver compiled w/ openssl)

See also the packetmounter example in the example directory.

  
#include "web_server.h"

int main()
        struct web_server serverssl;
        web_server_useSSLcert(&serverssl,"foo-cert.pem"); // Certificate file    
        if(!web_server_init(&serverssl,443,"help.log",WS_USESSL)) {
                fprintf(stderr,"Cannot open port\n");
        };
        while(1) {
                web_server_run(&serverssl);
        };
};
All the rest is the same as without SSL.

Gif generator

used functions;
web_server_init
web_server_addhandler
web_server_run
web_client_gifsetpalette
web_client_gifoutput
ClientInfo

This example draws an circle at x,y requested by client, and outputs with function web_client_gifoutput

#include "web_server.h"
#include <stdio.h>
#include <math.h>


#define GIFSIDE 320
char gifdata[GIFSIDE*GIFSIDE];
void outgif() {
	float i;
	int x,y,xc,yc;
	int color;
	web_client_gifsetpalette("EGA");
	if(*ClientInfo->Query("img")!=0) {
		printf("Content-type: image/gif\r\n\r\n");
		if(!strcmp(ClientInfo->Query("img"),"circle")) {
			xc=atoi(ClientInfo->Query("x"))%GIFSIDE;
			yc=atoi(ClientInfo->Query("y"))%GIFSIDE;
			color=(rand()%15)+1;
			for(i=0;i<6.28;i+=0.01) {
				x=(int)(GIFSIDE+(xc+cos(i)*10))%GIFSIDE;
				y=(int)(GIFSIDE+(yc+sin(i)*10))%GIFSIDE;
				gifdata[x+(y*GIFSIDE)]=color;
			};
		};
		web_client_gifoutput(gifdata,GIFSIDE,GIFSIDE);
	};
	printf("<center>Generated a circle (click inside the image)<BR>\n");
	printf("Pressed x=%s,y=%s<BR>\n",ClientInfo->Query("x"),ClientInfo->Query("y"));
	printf("<form><input type=image border=0 src='/gif?img=circle&x=%s&y=%s'></form></CENTER>\n",ClientInfo->Query("x"),ClientInfo->Query("y"));
};


main() {
	struct web_server server; // server handler
	memset(gifdata,0,GIFSIDE*GIFSIDE);
	if(!web_server_init(&server,83,"help.log",0)) { // initialize
		fprintf(stderr,"can't open listen socket\n");
	};

	web_server_addhandler(&server,"* /gif",outgif,0);
	while(1) {
		web_server_run(&server);   // run server
	};
};


Cookies

used functions;
web_server_init
web_server_addhandler
web_server_run
ClientInfo
web_client_setcookie

This example fetchs an client input and set's an cookie for 15 minutes "+15M" using function web_client_setcookie

#include "web_server.h"
#include <stdio.h>


void cookie() {
	if(strlen(ClientInfo->Post("user")))
		web_client_setcookie("username",ClientInfo->Post("user"),"+15M");
	printf("Content-type: text/html\r\n\r\n");
	printf("<form method='POST'>\r\n");
	printf("<input type='text' name='user' value='%s'>\r\n<BR>",ClientInfo->Cookie("username"));
	printf("<input type='submit' name='send' value=' GO! '>\r\n<BR>");
	printf("</form>\r\n");
}

int main(int argc,char** argv) {
        struct web_server server; // server handler
        if(!web_server_init(&server,80,"help.log",0)) { // initialize
                fprintf(stderr,"can't open listen socket\n");
		return 1;
        };

        web_server_addhandler(&server,"* /*",cookie,0); // add handler for all requests
        while(1) {
                web_server_run(&server);   // run server
        };
}



Checkbox

used functions;
web_server_init
web_server_addhandler
web_server_run
ClientInfo

This example uses a especific case from ClientInfo query and post, using the '#' as prefix of varname returning the number of occurences


#include "web_server.h"
#include <stdio.h>


void checkbox() {
	int i=0;
	char *txt[]={"one","two","three","four","five"};
	printf("Content-type: text/html\r\n\r\n");
	printf("<form method='QUERY'>\r\n");
	
	for(i=0;i<5;i++) {	
		printf("<input type='checkbox' name='number' value='%s'>\r\n<BR>",txt[i]);	
	};
	printf("<input type='submit' name='send' value=' SEND '>\r\n<BR>");
	printf("</form>\r\n");
	
	printf("You have choosen <font color='FF0000'>%d</font> numbers: \r\n",ClientInfo->Query("#number"));
	for(i=0;i<ClientInfo->Query("#number");i++) {	
		printf("<b>%s</b>,\r\n\r\n",ClientInfo->Query("number"));
	};
	printf("...<BR>\r\n\r\n");
	
}
int main(int argc,char** argv) {
        struct web_server server; // server handler
        if(!web_server_init(&server,80,"help.log",0)) { // initialize
                fprintf(stderr,"can't open listen socket\n");
		return 1;
        };

        web_server_addhandler(&server,"* /*",checkbox,0); // add handler for all requests
        while(1) {
                web_server_run(&server);   // run server
        };
}



Config example

used functions;
web_server_init
web_server_addhandler
web_server_run
web_client_addfile
ClientInfo



#include "web_server.h"
#include <stdio.h>


void confexample() {
	printf("Content-type: text/html\r\n\r\n");
	printf("<PRE>");
	web_client_addfile(server.conffile); // add help.cfg file to output	
	printf("</PRE>");
	printf("ClientInfo->Conf(\"PERSONAL_CONF\",\"PORT\")=%s<BR>\n",ClientInfo->Conf("PERSONAL_CONF","PORT"));
	printf("ClientInfo->Conf(\"PERSONAL_CONF\",\"IP\")=%s<BR>\n",ClientInfo->Conf("PERSONAL_CONF","IP"));
	printf("ClientInfo->Conf(\"LIBWEBSERVER\",\"PORT\")=%s<BR>\n",ClientInfo->Conf("LIBWEBSERVER","PORT"));
	
}

int main(int argc,char** argv) {
        struct web_server server; // server handler
        if(!web_server_init(&server,80,"help.cfg",WS_USEEXTCONF)) { // initialize
                fprintf(stderr,"can't open listen socket\n");
		return 1;
        };

        web_server_addhandler(&server,"* *",confexample,0); // add handler for all requests
        while(1) {
                web_server_run(&server);   // run server
        };
}