HTTP Client¶
About¶
Conenct to a remote host perform a HTTP GET action to fetch the root page ‘/’ from the remote host.
See the Socket Library Reference for more details.
Source code¶
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2018, Erik Moqvist
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* This file is part of the Simba project.
*/
#include "simba.h"
/* The ip address of the host to connect to. */
#define REMOTE_HOST_IP 216.58.211.142
int main()
{
struct socket_t socket;
char http_request[] =
"GET / HTTP/1.1\r\n"
"Host: " STRINGIFY(REMOTE_HOST_IP) "\r\n"
"\r\n";
char http_response[64];
char remote_host_ip[] = STRINGIFY(REMOTE_HOST_IP);
struct inet_addr_t remote_host_address;
/* Start the system. Brings up the configured network interfaces
and starts the TCP/IP-stack. */
sys_start();
/* Open the tcp socket. */
socket_open_tcp(&socket);
std_printf(FSTR("Connecting to '%s'.\r\n"), remote_host_ip);
if (inet_aton(remote_host_ip, &remote_host_address.ip) != 0) {
std_printf(FSTR("Bad ip address ''.\r\n"), remote_host_ip);
return (-1);
}
remote_host_address.port = 80;
if (socket_connect(&socket, &remote_host_address) != 0) {
std_printf(FSTR("Failed to connect to '%s'.\r\n"), remote_host_ip);
return (-1);
}
/* Send the HTTP request... */
if (socket_write(&socket,
http_request,
strlen(http_request)) != strlen(http_request)) {
std_printf(FSTR("Failed to send the HTTP request.\r\n"));
return (-1);
}
/* ...and receive the first 64 bytes of the response. */
if (socket_read(&socket,
http_response,
sizeof(http_response)) != sizeof(http_response)) {
std_printf(FSTR("Failed to receive the response.\r\n"));
}
std_printf(FSTR("First 64 bytes of the response:\r\n"
"%s"),
http_response);
/* Close the socket. */
socket_close(&socket);
return (0);
}
The source code can also be found on Github in the examples/http_client folder.
Build and run¶
Build and run the application.
$ cd examples/http_client
$ make -s BOARD=<board> SSID=<wifi SSID> PASSWORD=<wifi password> run
...
Connecting to WiFi with SSID 'Qvist'.
Connected to WiFi with SSID 'Qvist'. Got IP address '192.168.1.103'.
Connecting to '216.58.211.142'.
First 64 bytes of the response:
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/GET / HTTP/1.1
Host: 216.58.211.142
...
$