http_client.c
Go to the documentation of this file.
1 // Copyright (c) 2014 Cesanta Software
2 // All rights reserved
3 //
4 // This example demostrates how to connect to the remote Web server,
5 // download data, process it and send back a reply.
6 
7 #include <signal.h>
8 #include <stdlib.h>
9 
10 #include "mongoose.h"
11 
12 static int s_received_signal = 0;
13 static struct mg_server *s_server = NULL;
14 static const char *s_remote_addr = "glosbe.com:80";
15 
16 static void signal_handler(int sig_num) {
17  signal(sig_num, signal_handler);
18  s_received_signal = sig_num;
19 }
20 
21 static int ev_handler(struct mg_connection *conn, enum mg_event ev) {
22  struct mg_connection *client, *orig;
23 
24  switch (ev) {
25  case MG_AUTH:
26  return MG_TRUE;
27 
28  case MG_CONNECT:
29  // Send request to the remote host.
30  // TODO(lsm): handle connect error here.
31  mg_printf(conn, "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n",
32  "/gapi/translate?from=eng&dest=fra&format=json&phrase=cat",
34  return MG_TRUE;
35 
36  case MG_REPLY:
37  // Send reply to the original connection
38  orig = (struct mg_connection *) conn->connection_param;
39  mg_send_status(orig, conn->status_code);
40  mg_send_header(orig, "Content-Type", "text/plain");
41  mg_send_data(orig, conn->content, conn->content_len);
42  mg_send_data(orig, "", 0); // Last chunk: mark the end of reply
43 
44  // Disconnect connections
45  orig->connection_param = NULL;
46  conn->connection_param = NULL;
47  return MG_TRUE;
48 
49  case MG_REQUEST:
50  if ((client = mg_connect(s_server, s_remote_addr)) != NULL) {
51  // Interconnect requests
52  client->connection_param = conn;
53  conn->connection_param = client;
54  return MG_MORE;
55  } else {
56  mg_printf_data(conn, "%s", "cannot send API request");
57  return MG_TRUE;
58  }
59 
60  default:
61  return MG_FALSE;
62  }
63 }
64 
65 int main(void) {
66  s_server = mg_create_server(NULL, ev_handler);
67 
68  mg_set_option(s_server, "listening_port", "8080");
69 
70  // Setup signal handlers
71  signal(SIGTERM, signal_handler);
72  signal(SIGINT, signal_handler);
73 
74  printf("Listening on port %s\n", mg_get_option(s_server, "listening_port"));
75  while (s_received_signal == 0) {
76  mg_poll_server(s_server, 1000);
77  }
78  mg_destroy_server(&s_server);
79  printf("Existing on signal %d\n", s_received_signal);
80 
81  return EXIT_SUCCESS;
82 }
void mg_send_header(struct mg_connection *c, const char *name, const char *v)
Definition: mongoose.c:2759
static struct mg_server * s_server
Definition: http_client.c:13
void * connection_param
Definition: mongoose.h:56
int main(void)
Definition: http_client.c:65
struct mg_server * mg_create_server(void *server_data, mg_handler_t handler)
Definition: mongoose.c:5431
const char * mg_get_option(const struct mg_server *server, const char *name)
Definition: mongoose.c:5425
int status_code
Definition: mongoose.h:53
void mg_send_status(struct mg_connection *c, int status)
Definition: mongoose.c:2750
time_t mg_poll_server(struct mg_server *server, int milliseconds)
Definition: mongoose.c:4965
static const char * s_remote_addr
Definition: http_client.c:14
size_t mg_printf_data(struct mg_connection *c, const char *fmt,...)
Definition: mongoose.c:2785
#define printf
Definition: curl_printf.h:40
static void signal_handler(int sig_num)
Definition: http_client.c:16
mg_event
Definition: mongoose.h:62
struct mg_connection * mg_connect(struct mg_server *server, const char *addr)
Definition: mongoose.c:4818
static int ev_handler(struct mg_connection *conn, enum mg_event ev)
Definition: http_client.c:21
const char * mg_set_option(struct mg_server *server, const char *name, const char *value)
Definition: mongoose.c:5143
size_t mg_printf(struct mg_connection *conn, const char *fmt,...)
Definition: mongoose.c:1949
static int s_received_signal
Definition: http_client.c:12
void mg_destroy_server(struct mg_server **server)
Definition: mongoose.c:4969
size_t content_len
Definition: mongoose.h:50
char * content
Definition: mongoose.h:49
size_t mg_send_data(struct mg_connection *c, const void *data, int data_len)
Definition: mongoose.c:2778


rc_tagdetect_client
Author(s): Monika Florek-Jasinska , Raphael Schaller
autogenerated on Sat Feb 13 2021 03:42:15