13 However, due to the different pointer type, the function pointers do not type check out of the box. |
13 However, due to the different pointer type, the function pointers do not type check out of the box. |
14 For convenience, the macros `cxBufferReadFunc` and `cxBufferWriteFunc` are defined, which perform the necessary cast. |
14 For convenience, the macros `cxBufferReadFunc` and `cxBufferWriteFunc` are defined, which perform the necessary cast. |
15 |
15 |
16 ## Example |
16 ## Example |
17 |
17 |
18 <warning> |
18 In the following example we use a `CxBuffer`, the `bprintf()` macro from the [UCX printf header](printf.h.md), |
19 TODO: add example |
19 and a [UCX map](map.h.md) to create a simple HTTP GET request. |
20 </warning> |
20 |
|
21 ```C |
|
22 #include <cx/buffer.h> |
|
23 #include <cx/printf.h> |
|
24 #include <cx/map.h> |
|
25 |
|
26 void send_get_request( |
|
27 void *net_target, |
|
28 cx_write_func net_write, |
|
29 const char *host, |
|
30 const char *path, |
|
31 CxMap *header |
|
32 ) { |
|
33 // initialize buffer and use stack memory for small requests |
|
34 char stackmem[128]; |
|
35 CxBuffer buf; |
|
36 cxBufferInit( |
|
37 &buf, stackmem, sizeof(stackmem), |
|
38 cxDefaultAllocator, |
|
39 CX_BUFFER_COPY_ON_EXTEND // move to heap when request is larger |
|
40 ); |
|
41 |
|
42 // basic request data |
|
43 cx_bprintf(&buf, "GET %s HTTP/1.1\r\n", path); |
|
44 cx_bprintf(&buf, "Host: %s\r\n", host); |
|
45 |
|
46 // add headers |
|
47 CxMapIterator iter = cxMapIterator(header); |
|
48 cx_foreach(CxMapEntry*, entry, iter) { |
|
49 cxstring name = cx_strn(entry->key->data, entry->key->len); |
|
50 cx_bprintf(&buf, "%.*s: %s\r\n", |
|
51 (int) name.length, name.ptr, entry->value |
|
52 ); |
|
53 } |
|
54 |
|
55 // blank line terminates |
|
56 cxBufferWrite("\r\n", 1, 2, &buf); |
|
57 |
|
58 // write request to the network stream and destroy the buffer |
|
59 net_write(buf.space, 1, buf.size, net_target); |
|
60 cxBufferDestroy(&buf); |
|
61 } |
|
62 ``` |
21 |
63 |
22 ## Create |
64 ## Create |
23 |
65 |
24 ```C |
66 ```C |
25 #include <cx/buffer.h> |
67 #include <cx/buffer.h> |