Page 3 of 11
Article Index
Page 38 Python HTTP Server
from http.server import HTTPServer, BaseHTTPRequestHandler
from io import BytesIO
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def sendResponse(self, cmd):
content_length = int(self.headers['Content-Length'])
body = self.rfile.read(content_length)
self.send_response(200)
self.end_headers()
response = BytesIO()
response.write(b'This is a '+bytes(cmd, 'utf-8')+
b' request. ')
response.write(b'Received: ')
response.write(body)
self.wfile.write(response.getvalue())
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(b'Hello, world!')
def do_HEAD(self):
self.send_response(200)
self.end_headers()
def do_POST(self):
self.sendResponse("POST")
def do_PUT(self):
self.sendResponse("PUT")
def do_DELETE(self):
self.sendResponse("DELETE")
def do_PATCH(self):
self.sendResponse("PATCH")
httpd = HTTPServer(('', 8080), SimpleHTTPRequestHandler)
httpd.serve_forever()
Page 42 Simple HTTP Client using standard lwipopts.h and cmakelists.txt
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
#include "setupWifi.h"
#include "lwip/tcp.h"
#define BUF_SIZE 2048
char myBuff[BUF_SIZE];
char header[] = "GET /index.html HTTP/1.1\r\nHOST:example.com\r\nConnection: close\r\n\r\n";
err_t recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
{
if (p != NULL)
{
printf("recv total %d this buffer %d next %d err %d\n", p->tot_len, p->len, p->next, err);
pbuf_copy_partial(p, myBuff, p->tot_len, 0);
myBuff[p->tot_len] = 0;
printf("Buffer= %s\n", myBuff);
tcp_recved(pcb, p->tot_len);
pbuf_free(p);
}
return ERR_OK;
}
static err_t connected(void *arg, struct tcp_pcb *pcb, err_t err)
{
err = tcp_write(pcb, header, strlen(header), 0);
err = tcp_output(pcb);
return ERR_OK;
}
int main()
{
stdio_init_all();
connect();
struct tcp_pcb *pcb = tcp_new();
tcp_recv(pcb, recv);
ip_addr_t ip;
IP4_ADDR(&ip, 93, 184, 216, 34);
cyw43_arch_lwip_begin();
err_t err = tcp_connect(pcb, &ip, 80, connected);
cyw43_arch_lwip_end();
while (true)
{
sleep_ms(500);
}
}
Page 44 Simple HTTP Client Using ALTCP
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
#include "setupWifi.h"
#include "lwip/altcp.h"
#define BUF_SIZE 2048
char myBuff[BUF_SIZE];
char header[] = "GET /index.html HTTP/1.1\r\nHOST:example.com\r\n\r\n";
err_t recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err)
{
if (p != NULL)
{
printf("recv total %d this buffer %d next %d err %d\n", p->tot_len, p->len, p->next, err);
pbuf_copy_partial(p, myBuff, p->tot_len, 0);
myBuff[p->tot_len] = 0;
printf("Buffer= %s\n", myBuff);
altcp_recved(pcb, p->tot_len);
pbuf_free(p);
}
return ERR_OK;
}
static err_t altcp_client_connected(void *arg, struct altcp_pcb *pcb, err_t err)
{
err = altcp_write(pcb, header, strlen(header), 0);
err = altcp_output(pcb);
return ERR_OK;
}
int main()
{
stdio_init_all();
connect();
struct altcp_pcb *pcb = altcp_new(NULL);
altcp_recv(pcb, recv);
ip_addr_t ip;
IP4_ADDR(&ip, 93, 184, 216, 34);
cyw43_arch_lwip_begin();
err_t err = altcp_connect(pcb, &ip, 80, altcp_client_connected);
cyw43_arch_lwip_end();
while (true)
{
sleep_ms(500);
}
}
Add to the end of lwipopts.h
#define LWIP_ALTCP 1
Page 45 Not listed in full in book
Final Practical HTTP Client main.c - standard cmakelists.txt and lwipopts.h with #define LWIP_ALTCP 1
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
#include "setupWifi.h"
#include "lwip/altcp.h"
#define BUF_SIZE 2048
char myBuff[BUF_SIZE];
char header[] = "GET /index.html HTTP/1.1\r\nHOST:example.com\r\n\r\n";
err_t recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err)
{
if (p != NULL)
{
printf("recv total %d this buffer %d next %d err %d\n", p->tot_len, p->len, p->next, err);
if ((p->tot_len) > 2)
{
pbuf_copy_partial(p, myBuff, p->tot_len, 0);
myBuff[p->tot_len] = 0;
printf("Buffer= %s\n", myBuff);
altcp_recved(pcb, p->tot_len);
}
pbuf_free(p);
} else
{
printf("Connection Closed");
altcp_close(pcb);
}
return ERR_OK;
}
err_t sent(void *arg, struct altcp_pcb *pcb, u16_t len)
{
printf("data sent %d\n", len);
}
void err(void *arg, err_t err)
{
if (err != ERR_ABRT)
{
printf("client_err %d\n", err);
}
}
err_t altcp_client_connected(void *arg, struct altcp_pcb *pcb, err_t err)
{
err = altcp_write(pcb, header, strlen(header), 0);
err = altcp_output(pcb);
return ERR_OK;
}
err_t poll(void *arg, struct altcp_pcb *pcb){
printf("Connection Closed");
altcp_close(pcb);
}
int main()
{
stdio_init_all();
connect();
struct altcp_pcb *pcb = altcp_new(NULL);
altcp_recv(pcb, recv);
altcp_sent(pcb, sent);
altcp_err(pcb, err);
altcp_poll(pcb, poll,10);
ip_addr_t ip;
IP4_ADDR(&ip, 93, 184, 216, 34);
cyw43_arch_lwip_begin();
err_t err = altcp_connect(pcb, &ip, 80, altcp_client_connected);
cyw43_arch_lwip_end();
while (true)
{
sleep_ms(500);
}
}