-
Notifications
You must be signed in to change notification settings - Fork 6
/
httpclient.c
90 lines (75 loc) · 2.07 KB
/
httpclient.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/* Generic */
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Network */
#include <netdb.h>
#include <sys/socket.h>
#define BUF_SIZE 100
// Get host information (used to establishConnection)
struct addrinfo *getHostInfo(char* host, char* port) {
int r;
struct addrinfo hints, *getaddrinfo_res;
// Setup hints
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
if ((r = getaddrinfo(host, port, &hints, &getaddrinfo_res))) {
fprintf(stderr, "[getHostInfo:21:getaddrinfo] %s\n", gai_strerror(r));
return NULL;
}
return getaddrinfo_res;
}
// Establish connection with host
int establishConnection(struct addrinfo *info) {
if (info == NULL) return -1;
int clientfd;
for (;info != NULL; info = info->ai_next) {
if ((clientfd = socket(info->ai_family,
info->ai_socktype,
info->ai_protocol)) < 0) {
perror("[establishConnection:35:socket]");
continue;
}
if (connect(clientfd, info->ai_addr, info->ai_addrlen) < 0) {
close(clientfd);
perror("[establishConnection:42:connect]");
continue;
}
freeaddrinfo(info);
return clientfd;
}
freeaddrinfo(info);
return -1;
}
// Send GET request
void GET(int clientfd, char *path) {
char req[1000] = {0};
sprintf(req, "GET %s HTTP/1.0\r\n\r\n", path);
send(clientfd, req, strlen(req), 0);
}
int main(int argc, char **argv) {
int clientfd;
char buf[BUF_SIZE];
if (argc != 4) {
fprintf(stderr, "USAGE: ./httpclient <hostname> <port> <request path>\n");
return 1;
}
// Establish connection with <hostname>:<port>
clientfd = establishConnection(getHostInfo(argv[1], argv[2]));
if (clientfd == -1) {
fprintf(stderr,
"[main:73] Failed to connect to: %s:%s%s \n",
argv[1], argv[2], argv[3]);
return 3;
}
// Send GET request > stdout
GET(clientfd, argv[3]);
while (recv(clientfd, buf, BUF_SIZE, 0) > 0) {
fputs(buf, stdout);
memset(buf, 0, BUF_SIZE);
}
close(clientfd);
return 0;
}