summaryrefslogtreecommitdiff
path: root/samples/net/http_client/README.rst
diff options
context:
space:
mode:
Diffstat (limited to 'samples/net/http_client/README.rst')
-rw-r--r--samples/net/http_client/README.rst229
1 files changed, 229 insertions, 0 deletions
diff --git a/samples/net/http_client/README.rst b/samples/net/http_client/README.rst
new file mode 100644
index 000000000..e3df1da85
--- /dev/null
+++ b/samples/net/http_client/README.rst
@@ -0,0 +1,229 @@
+HTTP Client
+###########
+
+Overview
+********
+
+This sample application shows how to create HTTP 1.1 requests to
+an HTTP server and how to parse the incoming responses.
+Supported HTTP 1.1 methods are: GET, HEAD, OPTIONS and POST.
+
+The source code for this sample application can be found at:
+:file:`samples/net/http_client`.
+
+Requirements
+************
+
+- Freedom Board (FRDM-K64F)
+- LAN for testing purposes (Ethernet)
+- Terminal emulator software
+- HTTP Server
+
+Building and Running
+********************
+
+Open the project configuration file for your platform, for example:
+:file:`prj_frdm_k64f.conf` is the configuration file for the
+:ref:`frdm_k64f` board. For IPv4 networks, set the following variables:
+
+.. code-block:: console
+
+ CONFIG_NET_IPV4=y
+ CONFIG_NET_IPV6=n
+
+IPv6 is the preferred routing technology for this sample application,
+if CONFIG_NET_IPV6=y is set, the value of CONFIG_NET_IPV4=y is ignored.
+
+In this sample application, only static IP addresses are supported,
+those addresses are specified in the project configuration file,
+for example:
+
+.. code-block:: console
+
+ CONFIG_NET_SAMPLES_MY_IPV6_ADDR="2001:db8::1"
+ CONFIG_NET_SAMPLES_PEER_IPV6_ADDR="2001:db8::2"
+
+are the IPv6 addresses for the HTTP client running Zephyr and the
+HTTP server, respectively.
+
+Alternatively, the IP addresses may be specified in the
+:file:`src/config.h` file.
+
+Open the :file:`src/config.h` file and set the server port
+to match the HTTP server setup, for example:
+
+.. code-block:: c
+
+ #define SERVER_PORT 80
+
+assumes that the HTTP server is listening at the TCP port 80.
+
+HTTP Server
+===========
+
+Setting up an HTTP server on your host computer is beyond the scope
+of this document.
+(We used `Apache 2 <http://httpd.apache.org/docs/2.4/getting-started.html>`_
+for testing this sample application.
+
+However, this application assumes that there is a server's
+resource that can process an HTTP 1.1 POST request.
+
+For example, assuming that the Apache 2 server with PHP support
+is used, and that the client sends a POST request with
+"Content-Type = application/x-www-form-urlencoded" the following
+PHP script will echo the POST payload back to the client:
+
+.. code-block:: html
+
+ <html>
+ <head>
+ <title>HTTP Server POST test</title>
+ </head>
+ <body>
+ <?php
+ echo '<p>POST key/values:</p>';
+ foreach ($_POST as $key => $value) {
+ echo "<p> {$key} : {$value} </p>";
+ }
+ ?>
+ </body>
+ </html>
+
+In the machine hosting the HTTP server, this php script is at
+:file:`/var/www/html/post_test.php`. However, for your test machine
+this path can be different, but should be at your server's root folder.
+
+HTTP Responses
+==============
+
+Server's responses are processed by the http_receive_cb routine
+defined inside the :file:`src/http_client_rcv.c` file.
+
+This sample application only prints the HTTP header fields via
+the HTTP Parser Library, see :file:`include/net/http_parser.h`.
+To process the HTTP response's body, use the HTTP Parser's callbacks
+to determine where the body begins. Depending on the payload's size,
+it may be necessary to traverse the network buffer's fragment chain.
+See the :file:`src/http_client_rcv.c` file at line 70 for sample code
+that shows how to walk the fragment chain.
+
+FRDM K64F
+=========
+
+Open a terminal window and type:
+
+.. code-block:: console
+
+ $ make BOARD=frdm_k64f
+
+The FRDM K64F board is detected as a USB storage device. The board
+must be mounted (i.e. to /mnt) to 'flash' the binary:
+
+.. code-block:: console
+
+ $ cp outdir/frdm_k64f/zephyr.bin /mnt
+
+On Linux, use the 'dmesg' program to find the right USB device for the
+FRDM serial console. Assuming that this device is ttyACM0, open a
+terminal window and type:
+
+.. code-block:: console
+
+ $ screen /dev/ttyACM0 115200
+
+Once the binary is loaded into the FRDM board, press the RESET button.
+
+Refer to the board documentation in Zephyr, :ref:`frdm_k64f`,
+for more information about this board and how to access the FRDM
+serial console under other operating systems.
+
+Sample Output
+=============
+
+This sample application loops a specified number of times doing four
+HTTP 1.1 requests and displays the header fields that were extracted
+from the server's response. The four requests are:
+
+- GET "/index.html"
+- HEAD "/"
+- OPTIONS "/"
+- POST "/post_test.php"
+
+The terminal window where screen is running will show something similar
+to the following:
+
+.. code-block:: console
+
+ *******************************************
+ HTTP Client: 2001:db8::1
+ Connecting to: 2001:db8::2 port 80
+ Hostname: 2001:db8::2
+ HTTP Request: GET
+
+ --------- HTTP response (headers) ---------
+ Date: Thu, 02 Feb 2017 00:51:31 GMT
+ Server: Apache/2.4.10 (Debian)
+ Last-Modified: Sat, 28 Jan 2017 02:55:09 GMT
+ ETag: "3c-5471eb5db3c73"
+ Accept-Ranges: bytes
+ Content-Length: 60
+ Connection: close
+ Content-Type: text/html
+
+ HTTP server response status: OK
+ HTTP parser status: success
+ HTTP body: 60 bytes, expected: 60 bytes
+
+ *******************************************
+ HTTP Client: 2001:db8::1
+ Connecting to: 2001:db8::2 port 80
+ Hostname: 2001:db8::2
+ HTTP Request: HEAD
+
+ --------- HTTP response (headers) ---------
+ Date: Thu, 02 Feb 2017 00:51:37 GMT
+ Server: Apache/2.4.10 (Debian)
+ Last-Modified: Sat, 28 Jan 2017 02:55:09 GMT
+ ETag: "3c-5471eb5db3c73"
+ Accept-Ranges: bytes
+ Content-Length: 60
+ Connection: close
+ Content-Type: text/html
+
+ HTTP server response status: OK
+ HTTP parser status: success
+
+ *******************************************
+ HTTP Client: 2001:db8::1
+ Connecting to: 2001:db8::2 port 80
+ Hostname: 2001:db8::2
+ HTTP Request: OPTIONS
+
+ --------- HTTP response (headers) ---------
+ Date: Thu, 02 Feb 2017 00:51:43 GMT
+ Server: Apache/2.4.10 (Debian)
+ Allow: GET,HEAD,POST,OPTIONS
+ Content-Length: 0
+ Connection: close
+ Content-Type: text/html
+
+ HTTP server response status: OK
+ HTTP parser status: success
+
+ *******************************************
+ HTTP Client: 2001:db8::1
+ Connecting to: 2001:db8::2 port 80
+ Hostname: 2001:db8::2
+ HTTP Request: POST
+
+ --------- HTTP response (headers) ---------
+ Date: Thu, 02 Feb 2017 00:51:49 GMT
+ Server: Apache/2.4.10 (Debian)
+ Vary: Accept-Encoding
+ Content-Length: 231
+ Connection: close
+ Content-Type: text/html; charset=UTF-8
+
+ HTTP server response status: OK
+ HTTP parser status: success