https://github.com/markusfisch/libhttp
Light-weight C library for HTTP/1.1 requests
https://github.com/markusfisch/libhttp
c http-client
Last synced: 11 months ago
JSON representation
Light-weight C library for HTTP/1.1 requests
- Host: GitHub
- URL: https://github.com/markusfisch/libhttp
- Owner: markusfisch
- License: mit
- Created: 2013-08-22T19:31:51.000Z (almost 13 years ago)
- Default Branch: master
- Last Pushed: 2020-08-11T18:50:56.000Z (almost 6 years ago)
- Last Synced: 2023-03-11T13:38:05.349Z (about 3 years ago)
- Topics: c, http-client
- Language: C
- Size: 17.6 KB
- Stars: 18
- Watchers: 2
- Forks: 7
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
libhttp
=======
Light-weight C library for [HTTP/1.1][1] requests.
Meant for embedded environments or whereever [libcurl][3] would be just
too much.
Fitness
-------
If there's any chance you will ever need to make [HTTPS][2] requests or do
anything else than just plain simple HTTP/1.1 requests, use [libcurl][3].
This library aims to remain as simple and portable as possible to offer
a nice and small alternative.
Sample
------
### Simple GET request
For a simple GET request you just need to call http_request() and
http_response():
#include
#include
#include
#include
#include "http.h"
int main(int argc, char **argv) {
int sd;
struct http_message msg;
if (!--argc || (sd = http_request(*++argv)) < 1) {
perror("http_request");
return -1;
}
memset(&msg, 0, sizeof(msg));
while (http_response(sd, &msg) > 0) {
if (msg.content) {
write(1, msg.content, msg.length);
}
}
close(sd);
if (msg.header.code != 200) {
fprintf(
stderr,
"error: returned HTTP code %d\n",
msg.header.code);
}
return 0;
}
### Custom request
If you want to add/tweak some header values or do a POST request, use the low level functions http_parse_url(), http_connect() and http_send() to compose your request like this:
#include
#include
#include
#include
#include "http.h"
int post(int sd, struct http_url *url) {
char buf[1024];
snprintf(
buf,
sizeof(buf),
"\
POST /%s HTTP/1.1\r\n\
User-Agent: Mozilla/4.0 (Linux)\r\n\
Host: %s\r\n\
Accept: */*\r\n\
Content-Length: 13\r\n\
Connection: close\r\n\
\r\n\
q=Test&btn=Go\r\n\
\r\n",
url->query,
url->host);
if (http_send(sd, buf)) {
perror("http_send");
return -1;
}
return 0;
}
int main(int argc, char **argv) {
struct http_url *url;
struct http_message msg;
int sd;
if (!(url = http_parse_url(*++argv)) ||
!(sd = http_connect(url))) {
free(url);
perror("http_connect");
return -1;
}
memset(&msg, 0, sizeof(msg));
if (!post(sd, url)) {
while (http_response(sd, &msg) > 0) {
if (msg.content) {
write(1, msg.content, msg.length);
}
}
}
free(url);
close(sd);
if (msg.header.code != 200) {
fprintf(
stderr,
"error: returned HTTP code %d\n",
msg.header.code);
}
return 0;
}
Testing
-------
There's a bash script to test any URL list against libhttp:
$ cd test && bash test.sh [FILE-WITH-URLS]
If you find bugs, please report them.
[1]: https://en.wikipedia.org/wiki/HTTP
[2]: https://en.wikipedia.org/wiki/HTTP_Secure
[3]: https://github.com/bagder/curl