From 3eb4eb8074d059430398f553b62b5a63bd91c6d3 Mon Sep 17 00:00:00 2001 From: Dmitry Frank <mail@dmitryfrank.com> Date: Sat, 3 Feb 2018 01:16:14 +0200 Subject: [PATCH] Fix mongoose docs generation PUBLISHED_FROM=331821dcd1f7dc8a94581cd8a9b51aa00a89fddc --- docs/c-api/intro.md | 16 ++ docs/c-api/mbuf.h/intro.md | 20 +++ docs/c-api/mbuf.h/mbuf_append.md | 12 ++ docs/c-api/mbuf.h/mbuf_free.md | 10 ++ docs/c-api/mbuf.h/mbuf_init.md | 11 ++ docs/c-api/mbuf.h/mbuf_insert.md | 14 ++ docs/c-api/mbuf.h/mbuf_remove.md | 10 ++ docs/c-api/mbuf.h/mbuf_resize.md | 13 ++ docs/c-api/mbuf.h/mbuf_trim.md | 10 ++ docs/c-api/mbuf.h/struct_mbuf.md | 14 ++ docs/c-api/mg_coap.h/intro.md | 26 +++ docs/c-api/mg_coap.h/mg_coap_add_option.md | 14 ++ docs/c-api/mg_coap.h/mg_coap_compose.md | 12 ++ docs/c-api/mg_coap.h/mg_coap_free_options.md | 11 ++ docs/c-api/mg_coap.h/mg_coap_parse.md | 22 +++ docs/c-api/mg_coap.h/mg_coap_send_ack.md | 12 ++ docs/c-api/mg_coap.h/mg_coap_send_message.md | 19 ++ docs/c-api/mg_coap.h/mg_set_protocol_coap.md | 10 ++ .../c-api/mg_coap.h/struct_mg_coap_message.md | 20 +++ docs/c-api/mg_coap.h/struct_mg_coap_option.md | 16 ++ docs/c-api/mg_dns.h/intro.md | 20 +++ docs/c-api/mg_dns.h/mg_dns_copy_questions.md | 15 ++ docs/c-api/mg_dns.h/mg_dns_encode_name.md | 10 ++ docs/c-api/mg_dns.h/mg_dns_encode_record.md | 25 +++ docs/c-api/mg_dns.h/mg_dns_insert_header.md | 13 ++ .../mg_dns.h/mg_dns_parse_record_data.md | 20 +++ docs/c-api/mg_dns.h/mg_dns_uncompress_name.md | 21 +++ docs/c-api/mg_dns.h/mg_parse_dns.md | 10 ++ docs/c-api/mg_dns.h/mg_send_dns_query.md | 11 ++ docs/c-api/mg_dns.h/mg_set_protocol_dns.md | 19 ++ docs/c-api/mg_dns.h/struct_mg_dns_message.md | 18 ++ .../mg_dns.h/struct_mg_dns_resource_record.md | 17 ++ docs/c-api/mg_dns_server.h/intro.md | 12 ++ .../mg_dns_server.h/mg_dns_create_reply.md | 36 ++++ .../mg_dns_server.h/mg_dns_reply_record.md | 18 ++ .../mg_dns_server.h/mg_dns_send_reply.md | 19 ++ docs/c-api/mg_http.h/intro.md | 26 +++ docs/c-api/mg_http.h/mg_connect_ws.md | 29 +++ docs/c-api/mg_http.h/mg_connect_ws_opt.md | 14 ++ docs/c-api/mg_http.h/mg_http_is_authorized.md | 16 ++ .../mg_http_send_digest_auth_request.md | 11 ++ .../mg_http.h/mg_printf_websocket_frame.md | 14 ++ .../mg_http.h/mg_send_websocket_frame.md | 26 +++ .../mg_http.h/mg_send_websocket_framev.md | 12 ++ .../mg_http.h/mg_send_websocket_handshake.md | 22 +++ .../mg_http.h/mg_send_websocket_handshake2.md | 19 ++ .../mg_http.h/mg_send_websocket_handshake3.md | 13 ++ .../mg_send_websocket_handshake3v.md | 17 ++ .../mg_set_protocol_http_websocket.md | 59 +++++++ docs/c-api/mg_http.h/mg_url_decode.md | 19 ++ docs/c-api/mg_http.h/struct_http_message.md | 36 ++++ .../struct_mg_http_multipart_part.md | 16 ++ .../c-api/mg_http.h/struct_mg_ssi_call_ctx.md | 14 ++ .../mg_http.h/struct_websocket_message.md | 14 ++ docs/c-api/mg_http_client.h/intro.md | 12 ++ .../c-api/mg_http_client.h/mg_connect_http.md | 33 ++++ .../mg_http_client.h/mg_connect_http_opt.md | 15 ++ .../mg_http_create_digest_auth_header.md | 13 ++ docs/c-api/mg_http_server.h/intro.md | 32 ++++ .../mg_http_server.h/mg_check_digest_auth.md | 17 ++ .../mg_file_upload_handler.md | 41 +++++ docs/c-api/mg_http_server.h/mg_fu_fname_fn.md | 11 ++ .../mg_get_http_basic_auth.md | 14 ++ .../mg_http_server.h/mg_get_http_header.md | 13 ++ .../c-api/mg_http_server.h/mg_get_http_var.md | 17 ++ .../mg_http_check_digest_auth.md | 12 ++ .../mg_http_server.h/mg_http_parse_header.md | 23 +++ .../mg_http_server.h/mg_http_reverse_proxy.md | 19 ++ .../mg_http_server.h/mg_http_send_error.md | 11 ++ .../mg_http_server.h/mg_http_send_redirect.md | 20 +++ .../mg_http_server.h/mg_http_serve_file.md | 28 +++ docs/c-api/mg_http_server.h/mg_parse_http.md | 15 ++ .../mg_parse_http_basic_auth.md | 13 ++ .../mg_http_server.h/mg_parse_multipart.md | 46 +++++ .../mg_http_server.h/mg_printf_html_escape.md | 10 ++ .../mg_http_server.h/mg_printf_http_chunk.md | 11 ++ .../mg_register_http_endpoint.md | 36 ++++ docs/c-api/mg_http_server.h/mg_send_head.md | 22 +++ .../mg_http_server.h/mg_send_http_chunk.md | 25 +++ .../mg_http_server.h/mg_send_response_line.md | 21 +++ docs/c-api/mg_http_server.h/mg_serve_http.md | 28 +++ .../struct_mg_serve_http_opts.md | 165 ++++++++++++++++++ docs/c-api/mg_mqtt.h/intro.md | 29 +++ docs/c-api/mg_mqtt.h/mg_mqtt_connack.md | 10 ++ docs/c-api/mg_mqtt.h/mg_mqtt_disconnect.md | 10 ++ .../mg_mqtt_match_topic_expression.md | 12 ++ .../mg_mqtt.h/mg_mqtt_next_subscribe_topic.md | 15 ++ docs/c-api/mg_mqtt.h/mg_mqtt_ping.md | 10 ++ docs/c-api/mg_mqtt.h/mg_mqtt_pong.md | 10 ++ docs/c-api/mg_mqtt.h/mg_mqtt_puback.md | 10 ++ docs/c-api/mg_mqtt.h/mg_mqtt_pubcomp.md | 10 ++ docs/c-api/mg_mqtt.h/mg_mqtt_publish.md | 12 ++ docs/c-api/mg_mqtt.h/mg_mqtt_pubrec.md | 10 ++ docs/c-api/mg_mqtt.h/mg_mqtt_pubrel.md | 10 ++ docs/c-api/mg_mqtt.h/mg_mqtt_suback.md | 12 ++ docs/c-api/mg_mqtt.h/mg_mqtt_subscribe.md | 12 ++ docs/c-api/mg_mqtt.h/mg_mqtt_unsuback.md | 10 ++ docs/c-api/mg_mqtt.h/mg_mqtt_unsubscribe.md | 11 ++ .../mg_mqtt_vmatch_topic_expression.md | 11 ++ .../c-api/mg_mqtt.h/mg_send_mqtt_handshake.md | 10 ++ .../mg_mqtt.h/mg_send_mqtt_handshake_opt.md | 11 ++ docs/c-api/mg_mqtt.h/mg_set_protocol_mqtt.md | 20 +++ .../mg_mqtt.h/struct_mg_mqtt_proto_data.md | 13 ++ docs/c-api/mg_mqtt_server.h/LIST_ENTRY.md | 10 ++ docs/c-api/mg_mqtt_server.h/intro.md | 12 ++ .../mg_mqtt_server.h/struct_mg_mqtt_broker.md | 13 ++ .../struct_mg_mqtt_session.md | 17 ++ docs/c-api/mg_net.h/intro.md | 41 +++++ docs/c-api/mg_net.h/mg_add_sock.md | 15 ++ docs/c-api/mg_net.h/mg_add_sock_opt.md | 15 ++ docs/c-api/mg_net.h/mg_bind.md | 14 ++ docs/c-api/mg_net.h/mg_bind_opt.md | 27 +++ docs/c-api/mg_net.h/mg_broadcast.md | 20 +++ docs/c-api/mg_net.h/mg_check_ip_acl.md | 27 +++ docs/c-api/mg_net.h/mg_connect.md | 14 ++ docs/c-api/mg_net.h/mg_connect_opt.md | 57 ++++++ docs/c-api/mg_net.h/mg_event_handler_t.md | 12 ++ docs/c-api/mg_net.h/mg_mgr_free.md | 12 ++ docs/c-api/mg_net.h/mg_mgr_init.md | 15 ++ docs/c-api/mg_net.h/mg_mgr_init_opt.md | 14 ++ docs/c-api/mg_net.h/mg_mgr_poll.md | 15 ++ docs/c-api/mg_net.h/mg_next.md | 20 +++ docs/c-api/mg_net.h/mg_printf.md | 12 ++ docs/c-api/mg_net.h/mg_resolve.md | 17 ++ docs/c-api/mg_net.h/mg_send.md | 14 ++ docs/c-api/mg_net.h/mg_set_ssl.md | 22 +++ docs/c-api/mg_net.h/mg_set_timer.md | 31 ++++ docs/c-api/mg_net.h/mg_socketpair.md | 12 ++ docs/c-api/mg_net.h/mg_time.md | 10 ++ docs/c-api/mg_net.h/mg_vprintf.md | 10 ++ .../c-api/mg_net.h/struct_mg_add_sock_opts.md | 18 ++ docs/c-api/mg_net.h/struct_mg_bind_opts.md | 44 +++++ docs/c-api/mg_net.h/struct_mg_connect_opts.md | 62 +++++++ docs/c-api/mg_net.h/struct_mg_connection.md | 67 +++++++ docs/c-api/mg_net.h/struct_mg_mgr.md | 22 +++ .../c-api/mg_net.h/struct_mg_mgr_init_opts.md | 27 +++ docs/c-api/mg_resolv.h/intro.md | 14 ++ docs/c-api/mg_resolv.h/mg_resolve_async.md | 11 ++ .../c-api/mg_resolv.h/mg_resolve_async_opt.md | 30 ++++ .../mg_resolv.h/mg_resolve_from_hosts_file.md | 12 ++ docs/c-api/mg_resolv.h/mg_set_nameserver.md | 10 ++ .../struct_mg_resolve_async_opts.md | 17 ++ docs/c-api/mg_uri.h/intro.md | 11 ++ docs/c-api/mg_uri.h/mg_assemble_uri.md | 20 +++ docs/c-api/mg_uri.h/mg_parse_uri.md | 33 ++++ docs/c-api/mg_util.h/intro.md | 29 +++ docs/c-api/mg_util.h/mg_base64_decode.md | 17 ++ docs/c-api/mg_util.h/mg_base64_encode.md | 12 ++ docs/c-api/mg_util.h/mg_basic_auth_header.md | 13 ++ docs/c-api/mg_util.h/mg_conn_addr_to_str.md | 22 +++ docs/c-api/mg_util.h/mg_fopen.md | 14 ++ docs/c-api/mg_util.h/mg_fread.md | 12 ++ docs/c-api/mg_util.h/mg_fwrite.md | 12 ++ docs/c-api/mg_util.h/mg_hexdump.md | 15 ++ docs/c-api/mg_util.h/mg_hexdump_connection.md | 15 ++ docs/c-api/mg_util.h/mg_hexdumpf.md | 10 ++ docs/c-api/mg_util.h/mg_is_big_endian.md | 10 ++ docs/c-api/mg_util.h/mg_mbuf_append_base64.md | 10 ++ .../mg_util.h/mg_mbuf_append_base64_putc.md | 10 ++ docs/c-api/mg_util.h/mg_open.md | 14 ++ docs/c-api/mg_util.h/mg_skip.md | 17 ++ docs/c-api/mg_util.h/mg_sock_addr_to_str.md | 13 ++ docs/c-api/mg_util.h/mg_sock_to_str.md | 10 ++ docs/c-api/mg_util.h/mg_start_thread.md | 13 ++ docs/c-api/mg_util.h/mg_stat.md | 14 ++ docs/c-api/mg_util.h/mg_url_encode.md | 13 ++ 166 files changed, 3125 insertions(+) create mode 100644 docs/c-api/intro.md create mode 100644 docs/c-api/mbuf.h/intro.md create mode 100644 docs/c-api/mbuf.h/mbuf_append.md create mode 100644 docs/c-api/mbuf.h/mbuf_free.md create mode 100644 docs/c-api/mbuf.h/mbuf_init.md create mode 100644 docs/c-api/mbuf.h/mbuf_insert.md create mode 100644 docs/c-api/mbuf.h/mbuf_remove.md create mode 100644 docs/c-api/mbuf.h/mbuf_resize.md create mode 100644 docs/c-api/mbuf.h/mbuf_trim.md create mode 100644 docs/c-api/mbuf.h/struct_mbuf.md create mode 100644 docs/c-api/mg_coap.h/intro.md create mode 100644 docs/c-api/mg_coap.h/mg_coap_add_option.md create mode 100644 docs/c-api/mg_coap.h/mg_coap_compose.md create mode 100644 docs/c-api/mg_coap.h/mg_coap_free_options.md create mode 100644 docs/c-api/mg_coap.h/mg_coap_parse.md create mode 100644 docs/c-api/mg_coap.h/mg_coap_send_ack.md create mode 100644 docs/c-api/mg_coap.h/mg_coap_send_message.md create mode 100644 docs/c-api/mg_coap.h/mg_set_protocol_coap.md create mode 100644 docs/c-api/mg_coap.h/struct_mg_coap_message.md create mode 100644 docs/c-api/mg_coap.h/struct_mg_coap_option.md create mode 100644 docs/c-api/mg_dns.h/intro.md create mode 100644 docs/c-api/mg_dns.h/mg_dns_copy_questions.md create mode 100644 docs/c-api/mg_dns.h/mg_dns_encode_name.md create mode 100644 docs/c-api/mg_dns.h/mg_dns_encode_record.md create mode 100644 docs/c-api/mg_dns.h/mg_dns_insert_header.md create mode 100644 docs/c-api/mg_dns.h/mg_dns_parse_record_data.md create mode 100644 docs/c-api/mg_dns.h/mg_dns_uncompress_name.md create mode 100644 docs/c-api/mg_dns.h/mg_parse_dns.md create mode 100644 docs/c-api/mg_dns.h/mg_send_dns_query.md create mode 100644 docs/c-api/mg_dns.h/mg_set_protocol_dns.md create mode 100644 docs/c-api/mg_dns.h/struct_mg_dns_message.md create mode 100644 docs/c-api/mg_dns.h/struct_mg_dns_resource_record.md create mode 100644 docs/c-api/mg_dns_server.h/intro.md create mode 100644 docs/c-api/mg_dns_server.h/mg_dns_create_reply.md create mode 100644 docs/c-api/mg_dns_server.h/mg_dns_reply_record.md create mode 100644 docs/c-api/mg_dns_server.h/mg_dns_send_reply.md create mode 100644 docs/c-api/mg_http.h/intro.md create mode 100644 docs/c-api/mg_http.h/mg_connect_ws.md create mode 100644 docs/c-api/mg_http.h/mg_connect_ws_opt.md create mode 100644 docs/c-api/mg_http.h/mg_http_is_authorized.md create mode 100644 docs/c-api/mg_http.h/mg_http_send_digest_auth_request.md create mode 100644 docs/c-api/mg_http.h/mg_printf_websocket_frame.md create mode 100644 docs/c-api/mg_http.h/mg_send_websocket_frame.md create mode 100644 docs/c-api/mg_http.h/mg_send_websocket_framev.md create mode 100644 docs/c-api/mg_http.h/mg_send_websocket_handshake.md create mode 100644 docs/c-api/mg_http.h/mg_send_websocket_handshake2.md create mode 100644 docs/c-api/mg_http.h/mg_send_websocket_handshake3.md create mode 100644 docs/c-api/mg_http.h/mg_send_websocket_handshake3v.md create mode 100644 docs/c-api/mg_http.h/mg_set_protocol_http_websocket.md create mode 100644 docs/c-api/mg_http.h/mg_url_decode.md create mode 100644 docs/c-api/mg_http.h/struct_http_message.md create mode 100644 docs/c-api/mg_http.h/struct_mg_http_multipart_part.md create mode 100644 docs/c-api/mg_http.h/struct_mg_ssi_call_ctx.md create mode 100644 docs/c-api/mg_http.h/struct_websocket_message.md create mode 100644 docs/c-api/mg_http_client.h/intro.md create mode 100644 docs/c-api/mg_http_client.h/mg_connect_http.md create mode 100644 docs/c-api/mg_http_client.h/mg_connect_http_opt.md create mode 100644 docs/c-api/mg_http_client.h/mg_http_create_digest_auth_header.md create mode 100644 docs/c-api/mg_http_server.h/intro.md create mode 100644 docs/c-api/mg_http_server.h/mg_check_digest_auth.md create mode 100644 docs/c-api/mg_http_server.h/mg_file_upload_handler.md create mode 100644 docs/c-api/mg_http_server.h/mg_fu_fname_fn.md create mode 100644 docs/c-api/mg_http_server.h/mg_get_http_basic_auth.md create mode 100644 docs/c-api/mg_http_server.h/mg_get_http_header.md create mode 100644 docs/c-api/mg_http_server.h/mg_get_http_var.md create mode 100644 docs/c-api/mg_http_server.h/mg_http_check_digest_auth.md create mode 100644 docs/c-api/mg_http_server.h/mg_http_parse_header.md create mode 100644 docs/c-api/mg_http_server.h/mg_http_reverse_proxy.md create mode 100644 docs/c-api/mg_http_server.h/mg_http_send_error.md create mode 100644 docs/c-api/mg_http_server.h/mg_http_send_redirect.md create mode 100644 docs/c-api/mg_http_server.h/mg_http_serve_file.md create mode 100644 docs/c-api/mg_http_server.h/mg_parse_http.md create mode 100644 docs/c-api/mg_http_server.h/mg_parse_http_basic_auth.md create mode 100644 docs/c-api/mg_http_server.h/mg_parse_multipart.md create mode 100644 docs/c-api/mg_http_server.h/mg_printf_html_escape.md create mode 100644 docs/c-api/mg_http_server.h/mg_printf_http_chunk.md create mode 100644 docs/c-api/mg_http_server.h/mg_register_http_endpoint.md create mode 100644 docs/c-api/mg_http_server.h/mg_send_head.md create mode 100644 docs/c-api/mg_http_server.h/mg_send_http_chunk.md create mode 100644 docs/c-api/mg_http_server.h/mg_send_response_line.md create mode 100644 docs/c-api/mg_http_server.h/mg_serve_http.md create mode 100644 docs/c-api/mg_http_server.h/struct_mg_serve_http_opts.md create mode 100644 docs/c-api/mg_mqtt.h/intro.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_connack.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_disconnect.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_match_topic_expression.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_next_subscribe_topic.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_ping.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_pong.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_puback.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_pubcomp.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_publish.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_pubrec.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_pubrel.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_suback.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_subscribe.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_unsuback.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_unsubscribe.md create mode 100644 docs/c-api/mg_mqtt.h/mg_mqtt_vmatch_topic_expression.md create mode 100644 docs/c-api/mg_mqtt.h/mg_send_mqtt_handshake.md create mode 100644 docs/c-api/mg_mqtt.h/mg_send_mqtt_handshake_opt.md create mode 100644 docs/c-api/mg_mqtt.h/mg_set_protocol_mqtt.md create mode 100644 docs/c-api/mg_mqtt.h/struct_mg_mqtt_proto_data.md create mode 100644 docs/c-api/mg_mqtt_server.h/LIST_ENTRY.md create mode 100644 docs/c-api/mg_mqtt_server.h/intro.md create mode 100644 docs/c-api/mg_mqtt_server.h/struct_mg_mqtt_broker.md create mode 100644 docs/c-api/mg_mqtt_server.h/struct_mg_mqtt_session.md create mode 100644 docs/c-api/mg_net.h/intro.md create mode 100644 docs/c-api/mg_net.h/mg_add_sock.md create mode 100644 docs/c-api/mg_net.h/mg_add_sock_opt.md create mode 100644 docs/c-api/mg_net.h/mg_bind.md create mode 100644 docs/c-api/mg_net.h/mg_bind_opt.md create mode 100644 docs/c-api/mg_net.h/mg_broadcast.md create mode 100644 docs/c-api/mg_net.h/mg_check_ip_acl.md create mode 100644 docs/c-api/mg_net.h/mg_connect.md create mode 100644 docs/c-api/mg_net.h/mg_connect_opt.md create mode 100644 docs/c-api/mg_net.h/mg_event_handler_t.md create mode 100644 docs/c-api/mg_net.h/mg_mgr_free.md create mode 100644 docs/c-api/mg_net.h/mg_mgr_init.md create mode 100644 docs/c-api/mg_net.h/mg_mgr_init_opt.md create mode 100644 docs/c-api/mg_net.h/mg_mgr_poll.md create mode 100644 docs/c-api/mg_net.h/mg_next.md create mode 100644 docs/c-api/mg_net.h/mg_printf.md create mode 100644 docs/c-api/mg_net.h/mg_resolve.md create mode 100644 docs/c-api/mg_net.h/mg_send.md create mode 100644 docs/c-api/mg_net.h/mg_set_ssl.md create mode 100644 docs/c-api/mg_net.h/mg_set_timer.md create mode 100644 docs/c-api/mg_net.h/mg_socketpair.md create mode 100644 docs/c-api/mg_net.h/mg_time.md create mode 100644 docs/c-api/mg_net.h/mg_vprintf.md create mode 100644 docs/c-api/mg_net.h/struct_mg_add_sock_opts.md create mode 100644 docs/c-api/mg_net.h/struct_mg_bind_opts.md create mode 100644 docs/c-api/mg_net.h/struct_mg_connect_opts.md create mode 100644 docs/c-api/mg_net.h/struct_mg_connection.md create mode 100644 docs/c-api/mg_net.h/struct_mg_mgr.md create mode 100644 docs/c-api/mg_net.h/struct_mg_mgr_init_opts.md create mode 100644 docs/c-api/mg_resolv.h/intro.md create mode 100644 docs/c-api/mg_resolv.h/mg_resolve_async.md create mode 100644 docs/c-api/mg_resolv.h/mg_resolve_async_opt.md create mode 100644 docs/c-api/mg_resolv.h/mg_resolve_from_hosts_file.md create mode 100644 docs/c-api/mg_resolv.h/mg_set_nameserver.md create mode 100644 docs/c-api/mg_resolv.h/struct_mg_resolve_async_opts.md create mode 100644 docs/c-api/mg_uri.h/intro.md create mode 100644 docs/c-api/mg_uri.h/mg_assemble_uri.md create mode 100644 docs/c-api/mg_uri.h/mg_parse_uri.md create mode 100644 docs/c-api/mg_util.h/intro.md create mode 100644 docs/c-api/mg_util.h/mg_base64_decode.md create mode 100644 docs/c-api/mg_util.h/mg_base64_encode.md create mode 100644 docs/c-api/mg_util.h/mg_basic_auth_header.md create mode 100644 docs/c-api/mg_util.h/mg_conn_addr_to_str.md create mode 100644 docs/c-api/mg_util.h/mg_fopen.md create mode 100644 docs/c-api/mg_util.h/mg_fread.md create mode 100644 docs/c-api/mg_util.h/mg_fwrite.md create mode 100644 docs/c-api/mg_util.h/mg_hexdump.md create mode 100644 docs/c-api/mg_util.h/mg_hexdump_connection.md create mode 100644 docs/c-api/mg_util.h/mg_hexdumpf.md create mode 100644 docs/c-api/mg_util.h/mg_is_big_endian.md create mode 100644 docs/c-api/mg_util.h/mg_mbuf_append_base64.md create mode 100644 docs/c-api/mg_util.h/mg_mbuf_append_base64_putc.md create mode 100644 docs/c-api/mg_util.h/mg_open.md create mode 100644 docs/c-api/mg_util.h/mg_skip.md create mode 100644 docs/c-api/mg_util.h/mg_sock_addr_to_str.md create mode 100644 docs/c-api/mg_util.h/mg_sock_to_str.md create mode 100644 docs/c-api/mg_util.h/mg_start_thread.md create mode 100644 docs/c-api/mg_util.h/mg_stat.md create mode 100644 docs/c-api/mg_util.h/mg_url_encode.md diff --git a/docs/c-api/intro.md b/docs/c-api/intro.md new file mode 100644 index 000000000..b6656ea5e --- /dev/null +++ b/docs/c-api/intro.md @@ -0,0 +1,16 @@ +--- +items: + - { name: mbuf.h } + - { name: mg_net.h } + - { name: mg_http.h } + - { name: mg_http_server.h } + - { name: mg_http_client.h } + - { name: mg_dns.h } + - { name: mg_dns_server.h } + - { name: mg_resolv.h } + - { name: mg_mqtt.h } + - { name: mg_mqtt_server.h } + - { name: mg_coap.h } + - { name: mg_util.h } + - { name: mg_uri.h } +--- diff --git a/docs/c-api/mbuf.h/intro.md b/docs/c-api/mbuf.h/intro.md new file mode 100644 index 000000000..475c65104 --- /dev/null +++ b/docs/c-api/mbuf.h/intro.md @@ -0,0 +1,20 @@ +--- +title: "Memory Buffers" +symbol_kind: "intro" +decl_name: "mbuf.h" +items: + - { name: mbuf_append.md } + - { name: mbuf_free.md } + - { name: mbuf_init.md } + - { name: mbuf_insert.md } + - { name: mbuf_remove.md } + - { name: mbuf_resize.md } + - { name: mbuf_trim.md } + - { name: struct_mbuf.md } +--- + +Mbufs are mutable/growing memory buffers, like C++ strings. +Mbuf can append data to the end of a buffer or insert data into arbitrary +position in the middle of a buffer. The buffer grows automatically when +needed. + diff --git a/docs/c-api/mbuf.h/mbuf_append.md b/docs/c-api/mbuf.h/mbuf_append.md new file mode 100644 index 000000000..af0de26eb --- /dev/null +++ b/docs/c-api/mbuf.h/mbuf_append.md @@ -0,0 +1,12 @@ +--- +title: "mbuf_append()" +decl_name: "mbuf_append" +symbol_kind: "func" +signature: | + size_t mbuf_append(struct mbuf *, const void *data, size_t data_size); +--- + +Appends data to the Mbuf. + +Returns the number of bytes appended or 0 if out of memory. + diff --git a/docs/c-api/mbuf.h/mbuf_free.md b/docs/c-api/mbuf.h/mbuf_free.md new file mode 100644 index 000000000..6b5e455bf --- /dev/null +++ b/docs/c-api/mbuf.h/mbuf_free.md @@ -0,0 +1,10 @@ +--- +title: "mbuf_free()" +decl_name: "mbuf_free" +symbol_kind: "func" +signature: | + void mbuf_free(struct mbuf *); +--- + +Frees the space allocated for the mbuffer and resets the mbuf structure. + diff --git a/docs/c-api/mbuf.h/mbuf_init.md b/docs/c-api/mbuf.h/mbuf_init.md new file mode 100644 index 000000000..bc61ca0e2 --- /dev/null +++ b/docs/c-api/mbuf.h/mbuf_init.md @@ -0,0 +1,11 @@ +--- +title: "mbuf_init()" +decl_name: "mbuf_init" +symbol_kind: "func" +signature: | + void mbuf_init(struct mbuf *, size_t initial_capacity); +--- + +Initialises an Mbuf. +`initial_capacity` specifies the initial capacity of the mbuf. + diff --git a/docs/c-api/mbuf.h/mbuf_insert.md b/docs/c-api/mbuf.h/mbuf_insert.md new file mode 100644 index 000000000..a38137a93 --- /dev/null +++ b/docs/c-api/mbuf.h/mbuf_insert.md @@ -0,0 +1,14 @@ +--- +title: "mbuf_insert()" +decl_name: "mbuf_insert" +symbol_kind: "func" +signature: | + size_t mbuf_insert(struct mbuf *, size_t, const void *, size_t); +--- + +Inserts data at a specified offset in the Mbuf. + +Existing data will be shifted forwards and the buffer will +be grown if necessary. +Returns the number of bytes inserted. + diff --git a/docs/c-api/mbuf.h/mbuf_remove.md b/docs/c-api/mbuf.h/mbuf_remove.md new file mode 100644 index 000000000..cf3e502d4 --- /dev/null +++ b/docs/c-api/mbuf.h/mbuf_remove.md @@ -0,0 +1,10 @@ +--- +title: "mbuf_remove()" +decl_name: "mbuf_remove" +symbol_kind: "func" +signature: | + void mbuf_remove(struct mbuf *, size_t data_size); +--- + +Removes `data_size` bytes from the beginning of the buffer. + diff --git a/docs/c-api/mbuf.h/mbuf_resize.md b/docs/c-api/mbuf.h/mbuf_resize.md new file mode 100644 index 000000000..0814383fa --- /dev/null +++ b/docs/c-api/mbuf.h/mbuf_resize.md @@ -0,0 +1,13 @@ +--- +title: "mbuf_resize()" +decl_name: "mbuf_resize" +symbol_kind: "func" +signature: | + void mbuf_resize(struct mbuf *, size_t new_size); +--- + +Resizes an Mbuf. + +If `new_size` is smaller than buffer's `len`, the +resize is not performed. + diff --git a/docs/c-api/mbuf.h/mbuf_trim.md b/docs/c-api/mbuf.h/mbuf_trim.md new file mode 100644 index 000000000..743b25f90 --- /dev/null +++ b/docs/c-api/mbuf.h/mbuf_trim.md @@ -0,0 +1,10 @@ +--- +title: "mbuf_trim()" +decl_name: "mbuf_trim" +symbol_kind: "func" +signature: | + void mbuf_trim(struct mbuf *); +--- + +Shrinks an Mbuf by resizing its `size` to `len`. + diff --git a/docs/c-api/mbuf.h/struct_mbuf.md b/docs/c-api/mbuf.h/struct_mbuf.md new file mode 100644 index 000000000..98dcdc33b --- /dev/null +++ b/docs/c-api/mbuf.h/struct_mbuf.md @@ -0,0 +1,14 @@ +--- +title: "struct mbuf" +decl_name: "struct mbuf" +symbol_kind: "struct" +signature: | + struct mbuf { + char *buf; /* Buffer pointer */ + size_t len; /* Data length. Data is located between offset 0 and len. */ + size_t size; /* Buffer size allocated by realloc(1). Must be >= len */ + }; +--- + +Memory buffer descriptor + diff --git a/docs/c-api/mg_coap.h/intro.md b/docs/c-api/mg_coap.h/intro.md new file mode 100644 index 000000000..b3c1cdcce --- /dev/null +++ b/docs/c-api/mg_coap.h/intro.md @@ -0,0 +1,26 @@ +--- +title: "CoAP API reference" +symbol_kind: "intro" +decl_name: "mg_coap.h" +items: + - { name: mg_coap_add_option.md } + - { name: mg_coap_compose.md } + - { name: mg_coap_free_options.md } + - { name: mg_coap_parse.md } + - { name: mg_coap_send_ack.md } + - { name: mg_coap_send_message.md } + - { name: mg_set_protocol_coap.md } + - { name: struct_mg_coap_message.md } + - { name: struct_mg_coap_option.md } +--- + +CoAP message format: + +``` ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +|Ver| T | TKL | Code | Message ID | Token (if any, TKL bytes) ... ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +| Options (if any) ... |1 1 1 1 1 1 1 1| Payload (if any) ... ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +``` + diff --git a/docs/c-api/mg_coap.h/mg_coap_add_option.md b/docs/c-api/mg_coap.h/mg_coap_add_option.md new file mode 100644 index 000000000..83e91d5f3 --- /dev/null +++ b/docs/c-api/mg_coap.h/mg_coap_add_option.md @@ -0,0 +1,14 @@ +--- +title: "mg_coap_add_option()" +decl_name: "mg_coap_add_option" +symbol_kind: "func" +signature: | + struct mg_coap_option *mg_coap_add_option(struct mg_coap_message *cm, + uint32_t number, char *value, + size_t len); +--- + +Adds a new option to mg_coap_message structure. +Returns pointer to the newly created option. +Note: options must be freed by using mg_coap_free_options + diff --git a/docs/c-api/mg_coap.h/mg_coap_compose.md b/docs/c-api/mg_coap.h/mg_coap_compose.md new file mode 100644 index 000000000..844c1b61b --- /dev/null +++ b/docs/c-api/mg_coap.h/mg_coap_compose.md @@ -0,0 +1,12 @@ +--- +title: "mg_coap_compose()" +decl_name: "mg_coap_compose" +symbol_kind: "func" +signature: | + uint32_t mg_coap_compose(struct mg_coap_message *cm, struct mbuf *io); +--- + +Composes CoAP message from mg_coap_message structure. +This is a helper function. +Return value: see `mg_coap_send_message()` + diff --git a/docs/c-api/mg_coap.h/mg_coap_free_options.md b/docs/c-api/mg_coap.h/mg_coap_free_options.md new file mode 100644 index 000000000..d429cf49e --- /dev/null +++ b/docs/c-api/mg_coap.h/mg_coap_free_options.md @@ -0,0 +1,11 @@ +--- +title: "mg_coap_free_options()" +decl_name: "mg_coap_free_options" +symbol_kind: "func" +signature: | + void mg_coap_free_options(struct mg_coap_message *cm); +--- + +Frees the memory allocated for options. +If the cm parameter doesn't contain any option it does nothing. + diff --git a/docs/c-api/mg_coap.h/mg_coap_parse.md b/docs/c-api/mg_coap.h/mg_coap_parse.md new file mode 100644 index 000000000..86885229d --- /dev/null +++ b/docs/c-api/mg_coap.h/mg_coap_parse.md @@ -0,0 +1,22 @@ +--- +title: "mg_coap_parse()" +decl_name: "mg_coap_parse" +symbol_kind: "func" +signature: | + uint32_t mg_coap_parse(struct mbuf *io, struct mg_coap_message *cm); +--- + +Parses CoAP message and fills mg_coap_message and returns cm->flags. +This is a helper function. + +NOTE: usually CoAP works over UDP, so lack of data means format error. +But, in theory, it is possible to use CoAP over TCP (according to RFC) + +The caller has to check results and treat COAP_NOT_ENOUGH_DATA according to +underlying protocol: + +- in case of UDP COAP_NOT_ENOUGH_DATA means COAP_FORMAT_ERROR, +- in case of TCP client can try to receive more data + +Return value: see `mg_coap_send_message()` + diff --git a/docs/c-api/mg_coap.h/mg_coap_send_ack.md b/docs/c-api/mg_coap.h/mg_coap_send_ack.md new file mode 100644 index 000000000..1475a9c58 --- /dev/null +++ b/docs/c-api/mg_coap.h/mg_coap_send_ack.md @@ -0,0 +1,12 @@ +--- +title: "mg_coap_send_ack()" +decl_name: "mg_coap_send_ack" +symbol_kind: "func" +signature: | + uint32_t mg_coap_send_ack(struct mg_connection *nc, uint16_t msg_id); +--- + +Composes CoAP acknowledgement from `mg_coap_message` +and sends it into `nc` connection. +Return value: see `mg_coap_send_message()` + diff --git a/docs/c-api/mg_coap.h/mg_coap_send_message.md b/docs/c-api/mg_coap.h/mg_coap_send_message.md new file mode 100644 index 000000000..a1acc01e5 --- /dev/null +++ b/docs/c-api/mg_coap.h/mg_coap_send_message.md @@ -0,0 +1,19 @@ +--- +title: "mg_coap_send_message()" +decl_name: "mg_coap_send_message" +symbol_kind: "func" +signature: | + uint32_t mg_coap_send_message(struct mg_connection *nc, + struct mg_coap_message *cm); +--- + +Composes a CoAP message from `mg_coap_message` +and sends it into `nc` connection. +Returns 0 on success. On error, it is a bitmask: + +- `#define MG_COAP_ERROR 0x10000` +- `#define MG_COAP_FORMAT_ERROR (MG_COAP_ERROR | 0x20000)` +- `#define MG_COAP_IGNORE (MG_COAP_ERROR | 0x40000)` +- `#define MG_COAP_NOT_ENOUGH_DATA (MG_COAP_ERROR | 0x80000)` +- `#define MG_COAP_NETWORK_ERROR (MG_COAP_ERROR | 0x100000)` + diff --git a/docs/c-api/mg_coap.h/mg_set_protocol_coap.md b/docs/c-api/mg_coap.h/mg_set_protocol_coap.md new file mode 100644 index 000000000..523ae7cb4 --- /dev/null +++ b/docs/c-api/mg_coap.h/mg_set_protocol_coap.md @@ -0,0 +1,10 @@ +--- +title: "mg_set_protocol_coap()" +decl_name: "mg_set_protocol_coap" +symbol_kind: "func" +signature: | + int mg_set_protocol_coap(struct mg_connection *nc); +--- + +Sets CoAP protocol handler - triggers CoAP specific events. + diff --git a/docs/c-api/mg_coap.h/struct_mg_coap_message.md b/docs/c-api/mg_coap.h/struct_mg_coap_message.md new file mode 100644 index 000000000..0ea618a90 --- /dev/null +++ b/docs/c-api/mg_coap.h/struct_mg_coap_message.md @@ -0,0 +1,20 @@ +--- +title: "struct mg_coap_message" +decl_name: "struct mg_coap_message" +symbol_kind: "struct" +signature: | + struct mg_coap_message { + uint32_t flags; + uint8_t msg_type; + uint8_t code_class; + uint8_t code_detail; + uint16_t msg_id; + struct mg_str token; + struct mg_coap_option *options; + struct mg_str payload; + struct mg_coap_option *optiomg_tail; + }; +--- + +CoAP message. See RFC 7252 for details. + diff --git a/docs/c-api/mg_coap.h/struct_mg_coap_option.md b/docs/c-api/mg_coap.h/struct_mg_coap_option.md new file mode 100644 index 000000000..b5eeb15fa --- /dev/null +++ b/docs/c-api/mg_coap.h/struct_mg_coap_option.md @@ -0,0 +1,16 @@ +--- +title: "struct mg_coap_option" +decl_name: "struct mg_coap_option" +symbol_kind: "struct" +signature: | + struct mg_coap_option { + struct mg_coap_option *next; + uint32_t number; + struct mg_str value; + }; +--- + +CoAP options. +Use mg_coap_add_option and mg_coap_free_options +for creation and destruction. + diff --git a/docs/c-api/mg_dns.h/intro.md b/docs/c-api/mg_dns.h/intro.md new file mode 100644 index 000000000..092332e84 --- /dev/null +++ b/docs/c-api/mg_dns.h/intro.md @@ -0,0 +1,20 @@ +--- +title: "DNS API reference" +symbol_kind: "intro" +decl_name: "mg_dns.h" +items: + - { name: mg_dns_copy_questions.md } + - { name: mg_dns_encode_name.md } + - { name: mg_dns_encode_record.md } + - { name: mg_dns_insert_header.md } + - { name: mg_dns_parse_record_data.md } + - { name: mg_dns_uncompress_name.md } + - { name: mg_parse_dns.md } + - { name: mg_send_dns_query.md } + - { name: mg_set_protocol_dns.md } + - { name: struct_mg_dns_message.md } + - { name: struct_mg_dns_resource_record.md } +--- + + + diff --git a/docs/c-api/mg_dns.h/mg_dns_copy_questions.md b/docs/c-api/mg_dns.h/mg_dns_copy_questions.md new file mode 100644 index 000000000..f6f7dcb76 --- /dev/null +++ b/docs/c-api/mg_dns.h/mg_dns_copy_questions.md @@ -0,0 +1,15 @@ +--- +title: "mg_dns_copy_questions()" +decl_name: "mg_dns_copy_questions" +symbol_kind: "func" +signature: | + int mg_dns_copy_questions(struct mbuf *io, struct mg_dns_message *msg); +--- + +Appends already encoded questions from an existing message. + +This is useful when generating a DNS reply message which includes +all question records. + +Returns the number of appended bytes. + diff --git a/docs/c-api/mg_dns.h/mg_dns_encode_name.md b/docs/c-api/mg_dns.h/mg_dns_encode_name.md new file mode 100644 index 000000000..1b0e2a781 --- /dev/null +++ b/docs/c-api/mg_dns.h/mg_dns_encode_name.md @@ -0,0 +1,10 @@ +--- +title: "mg_dns_encode_name()" +decl_name: "mg_dns_encode_name" +symbol_kind: "func" +signature: | + int mg_dns_encode_name(struct mbuf *io, const char *name, size_t len); +--- + +Encodes a DNS name. + diff --git a/docs/c-api/mg_dns.h/mg_dns_encode_record.md b/docs/c-api/mg_dns.h/mg_dns_encode_record.md new file mode 100644 index 000000000..7c9f2cf2b --- /dev/null +++ b/docs/c-api/mg_dns.h/mg_dns_encode_record.md @@ -0,0 +1,25 @@ +--- +title: "mg_dns_encode_record()" +decl_name: "mg_dns_encode_record" +symbol_kind: "func" +signature: | + int mg_dns_encode_record(struct mbuf *io, struct mg_dns_resource_record *rr, + const char *name, size_t nlen, const void *rdata, + size_t rlen); +--- + +Encodes and appends a DNS resource record to an IO buffer. + +The record metadata is taken from the `rr` parameter, while the name and data +are taken from the parameters, encoded in the appropriate format depending on +record type and stored in the IO buffer. The encoded values might contain +offsets within the IO buffer. It's thus important that the IO buffer doesn't +get trimmed while a sequence of records are encoded while preparing a DNS +reply. + +This function doesn't update the `name` and `rdata` pointers in the `rr` +struct because they might be invalidated as soon as the IO buffer grows +again. + +Returns the number of bytes appended or -1 in case of error. + diff --git a/docs/c-api/mg_dns.h/mg_dns_insert_header.md b/docs/c-api/mg_dns.h/mg_dns_insert_header.md new file mode 100644 index 000000000..52b2ac3ef --- /dev/null +++ b/docs/c-api/mg_dns.h/mg_dns_insert_header.md @@ -0,0 +1,13 @@ +--- +title: "mg_dns_insert_header()" +decl_name: "mg_dns_insert_header" +symbol_kind: "func" +signature: | + int mg_dns_insert_header(struct mbuf *io, size_t pos, + struct mg_dns_message *msg); +--- + +Inserts a DNS header to an IO buffer. + +Returns the number of bytes inserted. + diff --git a/docs/c-api/mg_dns.h/mg_dns_parse_record_data.md b/docs/c-api/mg_dns.h/mg_dns_parse_record_data.md new file mode 100644 index 000000000..efe56ef4a --- /dev/null +++ b/docs/c-api/mg_dns.h/mg_dns_parse_record_data.md @@ -0,0 +1,20 @@ +--- +title: "mg_dns_parse_record_data()" +decl_name: "mg_dns_parse_record_data" +symbol_kind: "func" +signature: | + int mg_dns_parse_record_data(struct mg_dns_message *msg, + struct mg_dns_resource_record *rr, void *data, + size_t data_len); +--- + +Parses the record data from a DNS resource record. + + - A: struct in_addr *ina + - AAAA: struct in6_addr *ina + - CNAME: char buffer + +Returns -1 on error. + +TODO(mkm): MX + diff --git a/docs/c-api/mg_dns.h/mg_dns_uncompress_name.md b/docs/c-api/mg_dns.h/mg_dns_uncompress_name.md new file mode 100644 index 000000000..5e5fa53b0 --- /dev/null +++ b/docs/c-api/mg_dns.h/mg_dns_uncompress_name.md @@ -0,0 +1,21 @@ +--- +title: "mg_dns_uncompress_name()" +decl_name: "mg_dns_uncompress_name" +symbol_kind: "func" +signature: | + size_t mg_dns_uncompress_name(struct mg_dns_message *msg, struct mg_str *name, + char *dst, int dst_len); +--- + +Uncompresses a DNS compressed name. + +The containing DNS message is required because of the compressed encoding +and reference suffixes present elsewhere in the packet. + +If the name is less than `dst_len` characters long, the remainder +of `dst` is terminated with `\0` characters. Otherwise, `dst` is not +terminated. + +If `dst_len` is 0 `dst` can be NULL. +Returns the uncompressed name length. + diff --git a/docs/c-api/mg_dns.h/mg_parse_dns.md b/docs/c-api/mg_dns.h/mg_parse_dns.md new file mode 100644 index 000000000..3e28efeed --- /dev/null +++ b/docs/c-api/mg_dns.h/mg_parse_dns.md @@ -0,0 +1,10 @@ +--- +title: "mg_parse_dns()" +decl_name: "mg_parse_dns" +symbol_kind: "func" +signature: | + int mg_parse_dns(const char *buf, int len, struct mg_dns_message *msg); +--- + +Low-level: parses a DNS response. + diff --git a/docs/c-api/mg_dns.h/mg_send_dns_query.md b/docs/c-api/mg_dns.h/mg_send_dns_query.md new file mode 100644 index 000000000..a6b15da96 --- /dev/null +++ b/docs/c-api/mg_dns.h/mg_send_dns_query.md @@ -0,0 +1,11 @@ +--- +title: "mg_send_dns_query()" +decl_name: "mg_send_dns_query" +symbol_kind: "func" +signature: | + void mg_send_dns_query(struct mg_connection *nc, const char *name, + int query_type); +--- + +Sends a DNS query to the remote end. + diff --git a/docs/c-api/mg_dns.h/mg_set_protocol_dns.md b/docs/c-api/mg_dns.h/mg_set_protocol_dns.md new file mode 100644 index 000000000..fdf5ab59e --- /dev/null +++ b/docs/c-api/mg_dns.h/mg_set_protocol_dns.md @@ -0,0 +1,19 @@ +--- +title: "mg_set_protocol_dns()" +decl_name: "mg_set_protocol_dns" +symbol_kind: "func" +signature: | + void mg_set_protocol_dns(struct mg_connection *nc); +--- + +Attaches a built-in DNS event handler to the given listening connection. + +The DNS event handler parses the incoming UDP packets, treating them as DNS +requests. If an incoming packet gets successfully parsed by the DNS event +handler, a user event handler will receive an `MG_DNS_REQUEST` event, with +`ev_data` pointing to the parsed `struct mg_dns_message`. + +See +[captive_dns_server](https://github.com/cesanta/mongoose/tree/master/examples/captive_dns_server) +example on how to handle DNS request and send DNS reply. + diff --git a/docs/c-api/mg_dns.h/struct_mg_dns_message.md b/docs/c-api/mg_dns.h/struct_mg_dns_message.md new file mode 100644 index 000000000..9838bec9c --- /dev/null +++ b/docs/c-api/mg_dns.h/struct_mg_dns_message.md @@ -0,0 +1,18 @@ +--- +title: "struct mg_dns_message" +decl_name: "struct mg_dns_message" +symbol_kind: "struct" +signature: | + struct mg_dns_message { + struct mg_str pkt; /* packet body */ + uint16_t flags; + uint16_t transaction_id; + int num_questions; + int num_answers; + struct mg_dns_resource_record questions[MG_MAX_DNS_QUESTIONS]; + struct mg_dns_resource_record answers[MG_MAX_DNS_ANSWERS]; + }; +--- + +DNS message (request and response). + diff --git a/docs/c-api/mg_dns.h/struct_mg_dns_resource_record.md b/docs/c-api/mg_dns.h/struct_mg_dns_resource_record.md new file mode 100644 index 000000000..8ff7af403 --- /dev/null +++ b/docs/c-api/mg_dns.h/struct_mg_dns_resource_record.md @@ -0,0 +1,17 @@ +--- +title: "struct mg_dns_resource_record" +decl_name: "struct mg_dns_resource_record" +symbol_kind: "struct" +signature: | + struct mg_dns_resource_record { + struct mg_str name; /* buffer with compressed name */ + int rtype; + int rclass; + int ttl; + enum mg_dns_resource_record_kind kind; + struct mg_str rdata; /* protocol data (can be a compressed name) */ + }; +--- + +DNS resource record. + diff --git a/docs/c-api/mg_dns_server.h/intro.md b/docs/c-api/mg_dns_server.h/intro.md new file mode 100644 index 000000000..d83bb40a7 --- /dev/null +++ b/docs/c-api/mg_dns_server.h/intro.md @@ -0,0 +1,12 @@ +--- +title: "DNS server API reference" +symbol_kind: "intro" +decl_name: "mg_dns_server.h" +items: + - { name: mg_dns_create_reply.md } + - { name: mg_dns_reply_record.md } + - { name: mg_dns_send_reply.md } +--- + +Disabled by default; enable with `-DMG_ENABLE_DNS_SERVER`. + diff --git a/docs/c-api/mg_dns_server.h/mg_dns_create_reply.md b/docs/c-api/mg_dns_server.h/mg_dns_create_reply.md new file mode 100644 index 000000000..40c6f225d --- /dev/null +++ b/docs/c-api/mg_dns_server.h/mg_dns_create_reply.md @@ -0,0 +1,36 @@ +--- +title: "mg_dns_create_reply()" +decl_name: "mg_dns_create_reply" +symbol_kind: "func" +signature: | + struct mg_dns_reply mg_dns_create_reply(struct mbuf *io, + struct mg_dns_message *msg); +--- + +Creates a DNS reply. + +The reply will be based on an existing query message `msg`. +The query body will be appended to the output buffer. +"reply + recursion allowed" will be added to the message flags and the +message's num_answers will be set to 0. + +Answer records can be appended with `mg_dns_send_reply` or by lower +level function defined in the DNS API. + +In order to send a reply use `mg_dns_send_reply`. +It's possible to use a connection's send buffer as reply buffer, +and it will work for both UDP and TCP connections. + +Example: + +```c +reply = mg_dns_create_reply(&nc->send_mbuf, msg); +for (i = 0; i < msg->num_questions; i++) { + rr = &msg->questions[i]; + if (rr->rtype == MG_DNS_A_RECORD) { + mg_dns_reply_record(&reply, rr, 3600, &dummy_ip_addr, 4); + } +} +mg_dns_send_reply(nc, &reply); +``` + diff --git a/docs/c-api/mg_dns_server.h/mg_dns_reply_record.md b/docs/c-api/mg_dns_server.h/mg_dns_reply_record.md new file mode 100644 index 000000000..408f705f0 --- /dev/null +++ b/docs/c-api/mg_dns_server.h/mg_dns_reply_record.md @@ -0,0 +1,18 @@ +--- +title: "mg_dns_reply_record()" +decl_name: "mg_dns_reply_record" +symbol_kind: "func" +signature: | + int mg_dns_reply_record(struct mg_dns_reply *reply, + struct mg_dns_resource_record *question, + const char *name, int rtype, int ttl, const void *rdata, + size_t rdata_len); +--- + +Appends a DNS reply record to the IO buffer and to the DNS message. + +The message's num_answers field will be incremented. It's the caller's duty +to ensure num_answers is properly initialised. + +Returns -1 on error. + diff --git a/docs/c-api/mg_dns_server.h/mg_dns_send_reply.md b/docs/c-api/mg_dns_server.h/mg_dns_send_reply.md new file mode 100644 index 000000000..0460e7310 --- /dev/null +++ b/docs/c-api/mg_dns_server.h/mg_dns_send_reply.md @@ -0,0 +1,19 @@ +--- +title: "mg_dns_send_reply()" +decl_name: "mg_dns_send_reply" +symbol_kind: "func" +signature: | + void mg_dns_send_reply(struct mg_connection *nc, struct mg_dns_reply *r); +--- + +Sends a DNS reply through a connection. + +The DNS data is stored in an IO buffer pointed by reply structure in `r`. +This function mutates the content of that buffer in order to ensure that +the DNS header reflects the size and flags of the message, that might have +been updated either with `mg_dns_reply_record` or by direct manipulation of +`r->message`. + +Once sent, the IO buffer will be trimmed unless the reply IO buffer +is the connection's send buffer and the connection is not in UDP mode. + diff --git a/docs/c-api/mg_http.h/intro.md b/docs/c-api/mg_http.h/intro.md new file mode 100644 index 000000000..79b4f0fd7 --- /dev/null +++ b/docs/c-api/mg_http.h/intro.md @@ -0,0 +1,26 @@ +--- +title: "Common API reference" +symbol_kind: "intro" +decl_name: "mg_http.h" +items: + - { name: mg_connect_ws.md } + - { name: mg_connect_ws_opt.md } + - { name: mg_http_is_authorized.md } + - { name: mg_http_send_digest_auth_request.md } + - { name: mg_printf_websocket_frame.md } + - { name: mg_send_websocket_frame.md } + - { name: mg_send_websocket_framev.md } + - { name: mg_send_websocket_handshake.md } + - { name: mg_send_websocket_handshake2.md } + - { name: mg_send_websocket_handshake3.md } + - { name: mg_send_websocket_handshake3v.md } + - { name: mg_set_protocol_http_websocket.md } + - { name: mg_url_decode.md } + - { name: struct_http_message.md } + - { name: struct_mg_http_multipart_part.md } + - { name: struct_mg_ssi_call_ctx.md } + - { name: struct_websocket_message.md } +--- + + + diff --git a/docs/c-api/mg_http.h/mg_connect_ws.md b/docs/c-api/mg_http.h/mg_connect_ws.md new file mode 100644 index 000000000..7a5b517d3 --- /dev/null +++ b/docs/c-api/mg_http.h/mg_connect_ws.md @@ -0,0 +1,29 @@ +--- +title: "mg_connect_ws()" +decl_name: "mg_connect_ws" +symbol_kind: "func" +signature: | + struct mg_connection *mg_connect_ws(struct mg_mgr *mgr, + MG_CB(mg_event_handler_t event_handler, + void *user_data); +--- + +Helper function that creates an outbound WebSocket connection. + +`url` is a URL to connect to. It must be properly URL-encoded, e.g. have +no spaces, etc. By default, `mg_connect_ws()` sends Connection and +Host headers. `extra_headers` is an extra HTTP header to send, e.g. +`"User-Agent: my-app\r\n"`. +If `protocol` is not NULL, then a `Sec-WebSocket-Protocol` header is sent. + +Examples: + +```c + nc1 = mg_connect_ws(mgr, ev_handler_1, "ws://echo.websocket.org", NULL, + NULL); + nc2 = mg_connect_ws(mgr, ev_handler_1, "wss://echo.websocket.org", NULL, + NULL); + nc3 = mg_connect_ws(mgr, ev_handler_1, "ws://api.cesanta.com", + "clubby.cesanta.com", NULL); +``` + diff --git a/docs/c-api/mg_http.h/mg_connect_ws_opt.md b/docs/c-api/mg_http.h/mg_connect_ws_opt.md new file mode 100644 index 000000000..e2203cff6 --- /dev/null +++ b/docs/c-api/mg_http.h/mg_connect_ws_opt.md @@ -0,0 +1,14 @@ +--- +title: "mg_connect_ws_opt()" +decl_name: "mg_connect_ws_opt" +symbol_kind: "func" +signature: | + struct mg_connection *mg_connect_ws_opt( + struct mg_mgr *mgr, MG_CB(mg_event_handler_t ev_handler, void *user_data); +--- + +Helper function that creates an outbound WebSocket connection + +Mostly identical to `mg_connect_ws`, but allows to provide extra parameters +(for example, SSL parameters) + diff --git a/docs/c-api/mg_http.h/mg_http_is_authorized.md b/docs/c-api/mg_http.h/mg_http_is_authorized.md new file mode 100644 index 000000000..97f029ab0 --- /dev/null +++ b/docs/c-api/mg_http.h/mg_http_is_authorized.md @@ -0,0 +1,16 @@ +--- +title: "mg_http_is_authorized()" +decl_name: "mg_http_is_authorized" +symbol_kind: "func" +signature: | + int mg_http_is_authorized(struct http_message *hm, struct mg_str path, + const char *domain, const char *passwords_file, + int flags); +--- + +Checks whether an http request is authorized. `domain` is the authentication +realm, `passwords_file` is a htdigest file (can be created e.g. with +`htdigest` utility). If either `domain` or `passwords_file` is NULL, this +function always returns 1; otherwise checks the authentication in the +http request and returns 1 only if there is a match; 0 otherwise. + diff --git a/docs/c-api/mg_http.h/mg_http_send_digest_auth_request.md b/docs/c-api/mg_http.h/mg_http_send_digest_auth_request.md new file mode 100644 index 000000000..77b7f0514 --- /dev/null +++ b/docs/c-api/mg_http.h/mg_http_send_digest_auth_request.md @@ -0,0 +1,11 @@ +--- +title: "mg_http_send_digest_auth_request()" +decl_name: "mg_http_send_digest_auth_request" +symbol_kind: "func" +signature: | + void mg_http_send_digest_auth_request(struct mg_connection *c, + const char *domain); +--- + +Sends 401 Unauthorized response. + diff --git a/docs/c-api/mg_http.h/mg_printf_websocket_frame.md b/docs/c-api/mg_http.h/mg_printf_websocket_frame.md new file mode 100644 index 000000000..a7e8944bb --- /dev/null +++ b/docs/c-api/mg_http.h/mg_printf_websocket_frame.md @@ -0,0 +1,14 @@ +--- +title: "mg_printf_websocket_frame()" +decl_name: "mg_printf_websocket_frame" +symbol_kind: "func" +signature: | + void mg_printf_websocket_frame(struct mg_connection *nc, int op_and_flags, + const char *fmt, ...); +--- + +Sends WebSocket frame to the remote end. + +Like `mg_send_websocket_frame()`, but allows to create formatted messages +with `printf()`-like semantics. + diff --git a/docs/c-api/mg_http.h/mg_send_websocket_frame.md b/docs/c-api/mg_http.h/mg_send_websocket_frame.md new file mode 100644 index 000000000..8a407a68a --- /dev/null +++ b/docs/c-api/mg_http.h/mg_send_websocket_frame.md @@ -0,0 +1,26 @@ +--- +title: "mg_send_websocket_frame()" +decl_name: "mg_send_websocket_frame" +symbol_kind: "func" +signature: | + void mg_send_websocket_frame(struct mg_connection *nc, int op_and_flags, + const void *data, size_t data_len); +--- + +Send WebSocket frame to the remote end. + +`op_and_flags` specifies the frame's type. It's one of: + +- WEBSOCKET_OP_CONTINUE +- WEBSOCKET_OP_TEXT +- WEBSOCKET_OP_BINARY +- WEBSOCKET_OP_CLOSE +- WEBSOCKET_OP_PING +- WEBSOCKET_OP_PONG + +Orred with one of the flags: + +- WEBSOCKET_DONT_FIN: Don't set the FIN flag on the frame to be sent. + +`data` and `data_len` contain frame data. + diff --git a/docs/c-api/mg_http.h/mg_send_websocket_framev.md b/docs/c-api/mg_http.h/mg_send_websocket_framev.md new file mode 100644 index 000000000..ae7da3805 --- /dev/null +++ b/docs/c-api/mg_http.h/mg_send_websocket_framev.md @@ -0,0 +1,12 @@ +--- +title: "mg_send_websocket_framev()" +decl_name: "mg_send_websocket_framev" +symbol_kind: "func" +signature: | + void mg_send_websocket_framev(struct mg_connection *nc, int op_and_flags, + const struct mg_str *strings, int num_strings); +--- + +Like `mg_send_websocket_frame()`, but composes a single frame from multiple +buffers. + diff --git a/docs/c-api/mg_http.h/mg_send_websocket_handshake.md b/docs/c-api/mg_http.h/mg_send_websocket_handshake.md new file mode 100644 index 000000000..20ee7017b --- /dev/null +++ b/docs/c-api/mg_http.h/mg_send_websocket_handshake.md @@ -0,0 +1,22 @@ +--- +title: "mg_send_websocket_handshake()" +decl_name: "mg_send_websocket_handshake" +symbol_kind: "func" +signature: | + void mg_send_websocket_handshake(struct mg_connection *nc, const char *uri, + const char *extra_headers); +--- + +Send websocket handshake to the server. + +`nc` must be a valid connection, connected to a server. `uri` is an URI +to fetch, extra_headers` is extra HTTP headers to send or `NULL`. + +This function is intended to be used by websocket client. + +Note that the Host header is mandatory in HTTP/1.1 and must be +included in `extra_headers`. `mg_send_websocket_handshake2` offers +a better API for that. + +Deprecated in favour of `mg_send_websocket_handshake2` + diff --git a/docs/c-api/mg_http.h/mg_send_websocket_handshake2.md b/docs/c-api/mg_http.h/mg_send_websocket_handshake2.md new file mode 100644 index 000000000..27c5c3b82 --- /dev/null +++ b/docs/c-api/mg_http.h/mg_send_websocket_handshake2.md @@ -0,0 +1,19 @@ +--- +title: "mg_send_websocket_handshake2()" +decl_name: "mg_send_websocket_handshake2" +symbol_kind: "func" +signature: | + void mg_send_websocket_handshake2(struct mg_connection *nc, const char *path, + const char *host, const char *protocol, + const char *extra_headers); +--- + +Send websocket handshake to the server. + +`nc` must be a valid connection, connected to a server. `uri` is an URI +to fetch, `host` goes into the `Host` header, `protocol` goes into the +`Sec-WebSocket-Proto` header (NULL to omit), extra_headers` is extra HTTP +headers to send or `NULL`. + +This function is intended to be used by websocket client. + diff --git a/docs/c-api/mg_http.h/mg_send_websocket_handshake3.md b/docs/c-api/mg_http.h/mg_send_websocket_handshake3.md new file mode 100644 index 000000000..57abb6203 --- /dev/null +++ b/docs/c-api/mg_http.h/mg_send_websocket_handshake3.md @@ -0,0 +1,13 @@ +--- +title: "mg_send_websocket_handshake3()" +decl_name: "mg_send_websocket_handshake3" +symbol_kind: "func" +signature: | + void mg_send_websocket_handshake3(struct mg_connection *nc, const char *path, + const char *host, const char *protocol, + const char *extra_headers, const char *user, + const char *pass); +--- + +Like mg_send_websocket_handshake2 but also passes basic auth header + diff --git a/docs/c-api/mg_http.h/mg_send_websocket_handshake3v.md b/docs/c-api/mg_http.h/mg_send_websocket_handshake3v.md new file mode 100644 index 000000000..acf8c1e67 --- /dev/null +++ b/docs/c-api/mg_http.h/mg_send_websocket_handshake3v.md @@ -0,0 +1,17 @@ +--- +title: "mg_send_websocket_handshake3v()" +decl_name: "mg_send_websocket_handshake3v" +symbol_kind: "func" +signature: | + void mg_send_websocket_handshake3v(struct mg_connection *nc, + const struct mg_str path, + const struct mg_str host, + const struct mg_str protocol, + const struct mg_str extra_headers, + const struct mg_str user, + const struct mg_str pass); +--- + +Same as mg_send_websocket_handshake3 but with strings not necessarily +NUL-temrinated + diff --git a/docs/c-api/mg_http.h/mg_set_protocol_http_websocket.md b/docs/c-api/mg_http.h/mg_set_protocol_http_websocket.md new file mode 100644 index 000000000..a78ff3584 --- /dev/null +++ b/docs/c-api/mg_http.h/mg_set_protocol_http_websocket.md @@ -0,0 +1,59 @@ +--- +title: "mg_set_protocol_http_websocket()" +decl_name: "mg_set_protocol_http_websocket" +symbol_kind: "func" +signature: | + void mg_set_protocol_http_websocket(struct mg_connection *nc); +--- + +Attaches a built-in HTTP event handler to the given connection. +The user-defined event handler will receive following extra events: + +- MG_EV_HTTP_REQUEST: HTTP request has arrived. Parsed HTTP request + is passed as + `struct http_message` through the handler's `void *ev_data` pointer. +- MG_EV_HTTP_REPLY: The HTTP reply has arrived. The parsed HTTP reply is + passed as `struct http_message` through the handler's `void *ev_data` + pointer. +- MG_EV_HTTP_CHUNK: The HTTP chunked-encoding chunk has arrived. + The parsed HTTP reply is passed as `struct http_message` through the + handler's `void *ev_data` pointer. `http_message::body` would contain + incomplete, reassembled HTTP body. + It will grow with every new chunk that arrives, and it can + potentially consume a lot of memory. An event handler may process + the body as chunks are coming, and signal Mongoose to delete processed + body by setting `MG_F_DELETE_CHUNK` in `mg_connection::flags`. When + the last zero chunk is received, + Mongoose sends `MG_EV_HTTP_REPLY` event with + full reassembled body (if handler did not signal to delete chunks) or + with empty body (if handler did signal to delete chunks). +- MG_EV_WEBSOCKET_HANDSHAKE_REQUEST: server has received the WebSocket + handshake request. `ev_data` contains parsed HTTP request. +- MG_EV_WEBSOCKET_HANDSHAKE_DONE: server has completed the WebSocket + handshake. `ev_data` is `NULL`. +- MG_EV_WEBSOCKET_FRAME: new WebSocket frame has arrived. `ev_data` is + `struct websocket_message *` + +When compiled with MG_ENABLE_HTTP_STREAMING_MULTIPART, Mongoose parses +multipart requests and splits them into separate events: +- MG_EV_HTTP_MULTIPART_REQUEST: Start of the request. + This event is sent before body is parsed. After this, the user + should expect a sequence of PART_BEGIN/DATA/END requests. + This is also the last time when headers and other request fields are + accessible. +- MG_EV_HTTP_PART_BEGIN: Start of a part of a multipart message. + Argument: mg_http_multipart_part with var_name and file_name set + (if present). No data is passed in this message. +- MG_EV_HTTP_PART_DATA: new portion of data from the multipart message. + Argument: mg_http_multipart_part. var_name and file_name are preserved, + data is available in mg_http_multipart_part.data. +- MG_EV_HTTP_PART_END: End of the current part. var_name, file_name are + the same, no data in the message. If status is 0, then the part is + properly terminated with a boundary, status < 0 means that connection + was terminated. +- MG_EV_HTTP_MULTIPART_REQUEST_END: End of the multipart request. + Argument: mg_http_multipart_part, var_name and file_name are NULL, + status = 0 means request was properly closed, < 0 means connection + was terminated (note: in this case both PART_END and REQUEST_END are + delivered). + diff --git a/docs/c-api/mg_http.h/mg_url_decode.md b/docs/c-api/mg_http.h/mg_url_decode.md new file mode 100644 index 000000000..454acd03c --- /dev/null +++ b/docs/c-api/mg_http.h/mg_url_decode.md @@ -0,0 +1,19 @@ +--- +title: "mg_url_decode()" +decl_name: "mg_url_decode" +symbol_kind: "func" +signature: | + int mg_url_decode(const char *src, int src_len, char *dst, int dst_len, + int is_form_url_encoded); +--- + +Decodes a URL-encoded string. + +Source string is specified by (`src`, `src_len`), and destination is +(`dst`, `dst_len`). If `is_form_url_encoded` is non-zero, then +`+` character is decoded as a blank space character. This function +guarantees to NUL-terminate the destination. If destination is too small, +then the source string is partially decoded and `-1` is returned. +*Otherwise, +a length of the decoded string is returned, not counting final NUL. + diff --git a/docs/c-api/mg_http.h/struct_http_message.md b/docs/c-api/mg_http.h/struct_http_message.md new file mode 100644 index 000000000..9380496d4 --- /dev/null +++ b/docs/c-api/mg_http.h/struct_http_message.md @@ -0,0 +1,36 @@ +--- +title: "struct http_message" +decl_name: "struct http_message" +symbol_kind: "struct" +signature: | + struct http_message { + struct mg_str message; /* Whole message: request line + headers + body */ + struct mg_str body; /* Message body. 0-length for requests with no body */ + + /* HTTP Request line (or HTTP response line) */ + struct mg_str method; /* "GET" */ + struct mg_str uri; /* "/my_file.html" */ + struct mg_str proto; /* "HTTP/1.1" -- for both request and response */ + + /* For responses, code and response status message are set */ + int resp_code; + struct mg_str resp_status_msg; + + /* + * Query-string part of the URI. For example, for HTTP request + * GET /foo/bar?param1=val1¶m2=val2 + * | uri | query_string | + * + * Note that question mark character doesn't belong neither to the uri, + * nor to the query_string + */ + struct mg_str query_string; + + /* Headers */ + struct mg_str header_names[MG_MAX_HTTP_HEADERS]; + struct mg_str header_values[MG_MAX_HTTP_HEADERS]; + }; +--- + +HTTP message + diff --git a/docs/c-api/mg_http.h/struct_mg_http_multipart_part.md b/docs/c-api/mg_http.h/struct_mg_http_multipart_part.md new file mode 100644 index 000000000..cd2d0c2e4 --- /dev/null +++ b/docs/c-api/mg_http.h/struct_mg_http_multipart_part.md @@ -0,0 +1,16 @@ +--- +title: "struct mg_http_multipart_part" +decl_name: "struct mg_http_multipart_part" +symbol_kind: "struct" +signature: | + struct mg_http_multipart_part { + const char *file_name; + const char *var_name; + struct mg_str data; + int status; /* <0 on error */ + void *user_data; + }; +--- + +HTTP multipart part + diff --git a/docs/c-api/mg_http.h/struct_mg_ssi_call_ctx.md b/docs/c-api/mg_http.h/struct_mg_ssi_call_ctx.md new file mode 100644 index 000000000..2b430fd11 --- /dev/null +++ b/docs/c-api/mg_http.h/struct_mg_ssi_call_ctx.md @@ -0,0 +1,14 @@ +--- +title: "struct mg_ssi_call_ctx" +decl_name: "struct mg_ssi_call_ctx" +symbol_kind: "struct" +signature: | + struct mg_ssi_call_ctx { + struct http_message *req; /* The request being processed. */ + struct mg_str file; /* Filesystem path of the file being processed. */ + struct mg_str arg; /* The argument passed to the tag: <!-- call arg -->. */ + }; +--- + +SSI call context + diff --git a/docs/c-api/mg_http.h/struct_websocket_message.md b/docs/c-api/mg_http.h/struct_websocket_message.md new file mode 100644 index 000000000..37b7912a5 --- /dev/null +++ b/docs/c-api/mg_http.h/struct_websocket_message.md @@ -0,0 +1,14 @@ +--- +title: "struct websocket_message" +decl_name: "struct websocket_message" +symbol_kind: "struct" +signature: | + struct websocket_message { + unsigned char *data; + size_t size; + unsigned char flags; + }; +--- + +WebSocket message + diff --git a/docs/c-api/mg_http_client.h/intro.md b/docs/c-api/mg_http_client.h/intro.md new file mode 100644 index 000000000..755be4180 --- /dev/null +++ b/docs/c-api/mg_http_client.h/intro.md @@ -0,0 +1,12 @@ +--- +title: "Client API reference" +symbol_kind: "intro" +decl_name: "mg_http_client.h" +items: + - { name: mg_connect_http.md } + - { name: mg_connect_http_opt.md } + - { name: mg_http_create_digest_auth_header.md } +--- + + + diff --git a/docs/c-api/mg_http_client.h/mg_connect_http.md b/docs/c-api/mg_http_client.h/mg_connect_http.md new file mode 100644 index 000000000..4664fcd90 --- /dev/null +++ b/docs/c-api/mg_http_client.h/mg_connect_http.md @@ -0,0 +1,33 @@ +--- +title: "mg_connect_http()" +decl_name: "mg_connect_http" +symbol_kind: "func" +signature: | + struct mg_connection *mg_connect_http( + struct mg_mgr *mgr, + MG_CB(mg_event_handler_t event_handler, void *user_data); +--- + +Helper function that creates an outbound HTTP connection. + +`url` is the URL to fetch. It must be properly URL-encoded, e.g. have +no spaces, etc. By default, `mg_connect_http()` sends the Connection and +Host headers. `extra_headers` is an extra HTTP header to send, e.g. +`"User-Agent: my-app\r\n"`. +If `post_data` is NULL, then a GET request is created. Otherwise, a POST +request is created with the specified POST data. Note that if the data being +posted is a form submission, the `Content-Type` header should be set +accordingly (see example below). + +Examples: + +```c + nc1 = mg_connect_http(mgr, ev_handler_1, "http://www.google.com", NULL, + NULL); + nc2 = mg_connect_http(mgr, ev_handler_1, "https://github.com", NULL, NULL); + nc3 = mg_connect_http( + mgr, ev_handler_1, "my_server:8000/form_submit/", + "Content-Type: application/x-www-form-urlencoded\r\n", + "var_1=value_1&var_2=value_2"); +``` + diff --git a/docs/c-api/mg_http_client.h/mg_connect_http_opt.md b/docs/c-api/mg_http_client.h/mg_connect_http_opt.md new file mode 100644 index 000000000..29df1d753 --- /dev/null +++ b/docs/c-api/mg_http_client.h/mg_connect_http_opt.md @@ -0,0 +1,15 @@ +--- +title: "mg_connect_http_opt()" +decl_name: "mg_connect_http_opt" +symbol_kind: "func" +signature: | + struct mg_connection *mg_connect_http_opt( + struct mg_mgr *mgr, MG_CB(mg_event_handler_t ev_handler, void *user_data); +--- + +Helper function that creates an outbound HTTP connection. + +Mostly identical to mg_connect_http, but allows you to provide extra +*parameters +(for example, SSL parameters) + diff --git a/docs/c-api/mg_http_client.h/mg_http_create_digest_auth_header.md b/docs/c-api/mg_http_client.h/mg_http_create_digest_auth_header.md new file mode 100644 index 000000000..1842ea370 --- /dev/null +++ b/docs/c-api/mg_http_client.h/mg_http_create_digest_auth_header.md @@ -0,0 +1,13 @@ +--- +title: "mg_http_create_digest_auth_header()" +decl_name: "mg_http_create_digest_auth_header" +symbol_kind: "func" +signature: | + int mg_http_create_digest_auth_header(char *buf, size_t buf_len, + const char *method, const char *uri, + const char *auth_domain, const char *user, + const char *passwd, const char *nonce); +--- + +Creates digest authentication header for a client request. + diff --git a/docs/c-api/mg_http_server.h/intro.md b/docs/c-api/mg_http_server.h/intro.md new file mode 100644 index 000000000..03b026d9f --- /dev/null +++ b/docs/c-api/mg_http_server.h/intro.md @@ -0,0 +1,32 @@ +--- +title: "Server API reference" +symbol_kind: "intro" +decl_name: "mg_http_server.h" +items: + - { name: mg_check_digest_auth.md } + - { name: mg_file_upload_handler.md } + - { name: mg_get_http_basic_auth.md } + - { name: mg_get_http_header.md } + - { name: mg_get_http_var.md } + - { name: mg_http_check_digest_auth.md } + - { name: mg_http_parse_header.md } + - { name: mg_http_reverse_proxy.md } + - { name: mg_http_send_error.md } + - { name: mg_http_send_redirect.md } + - { name: mg_http_serve_file.md } + - { name: mg_parse_http.md } + - { name: mg_parse_http_basic_auth.md } + - { name: mg_parse_multipart.md } + - { name: mg_printf_html_escape.md } + - { name: mg_printf_http_chunk.md } + - { name: mg_register_http_endpoint.md } + - { name: mg_send_head.md } + - { name: mg_send_http_chunk.md } + - { name: mg_send_response_line.md } + - { name: mg_serve_http.md } + - { name: mg_fu_fname_fn.md } + - { name: struct_mg_serve_http_opts.md } +--- + + + diff --git a/docs/c-api/mg_http_server.h/mg_check_digest_auth.md b/docs/c-api/mg_http_server.h/mg_check_digest_auth.md new file mode 100644 index 000000000..189f0c4a9 --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_check_digest_auth.md @@ -0,0 +1,17 @@ +--- +title: "mg_check_digest_auth()" +decl_name: "mg_check_digest_auth" +symbol_kind: "func" +signature: | + int mg_check_digest_auth(struct mg_str method, struct mg_str uri, + struct mg_str username, struct mg_str cnonce, + struct mg_str response, struct mg_str qop, + struct mg_str nc, struct mg_str nonce, + struct mg_str auth_domain, FILE *fp); +--- + +Authenticates given response params against an opened password file. +Returns 1 if authenticated, 0 otherwise. + +It's used by mg_http_check_digest_auth(). + diff --git a/docs/c-api/mg_http_server.h/mg_file_upload_handler.md b/docs/c-api/mg_http_server.h/mg_file_upload_handler.md new file mode 100644 index 000000000..a2c9e016f --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_file_upload_handler.md @@ -0,0 +1,41 @@ +--- +title: "mg_file_upload_handler()" +decl_name: "mg_file_upload_handler" +symbol_kind: "func" +signature: | + void mg_file_upload_handler(struct mg_connection *nc, int ev, void *ev_data, + mg_fu_fname_fn local_name_fn + MG_UD_ARG(void *user_data); +--- + +File upload handler. +This handler can be used to implement file uploads with minimum code. +This handler will process MG_EV_HTTP_PART_* events and store file data into +a local file. +`local_name_fn` will be invoked with whatever name was provided by the client +and will expect the name of the local file to open. A return value of NULL +will abort file upload (client will get a "403 Forbidden" response). If +non-null, the returned string must be heap-allocated and will be freed by +the caller. +Exception: it is ok to return the same string verbatim. + +Example: + +```c +struct mg_str upload_fname(struct mg_connection *nc, struct mg_str fname) { + // Just return the same filename. Do not actually do this except in test! + // fname is user-controlled and needs to be sanitized. + return fname; +} +void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { + switch (ev) { + ... + case MG_EV_HTTP_PART_BEGIN: + case MG_EV_HTTP_PART_DATA: + case MG_EV_HTTP_PART_END: + mg_file_upload_handler(nc, ev, ev_data, upload_fname); + break; + } +} +``` + diff --git a/docs/c-api/mg_http_server.h/mg_fu_fname_fn.md b/docs/c-api/mg_http_server.h/mg_fu_fname_fn.md new file mode 100644 index 000000000..78aa7c8bd --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_fu_fname_fn.md @@ -0,0 +1,11 @@ +--- +title: "mg_fu_fname_fn" +decl_name: "mg_fu_fname_fn" +symbol_kind: "typedef" +signature: | + typedef struct mg_str (*mg_fu_fname_fn)(struct mg_connection *nc, + struct mg_str fname); +--- + +Callback prototype for `mg_file_upload_handler()`. + diff --git a/docs/c-api/mg_http_server.h/mg_get_http_basic_auth.md b/docs/c-api/mg_http_server.h/mg_get_http_basic_auth.md new file mode 100644 index 000000000..103d042fa --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_get_http_basic_auth.md @@ -0,0 +1,14 @@ +--- +title: "mg_get_http_basic_auth()" +decl_name: "mg_get_http_basic_auth" +symbol_kind: "func" +signature: | + int mg_get_http_basic_auth(struct http_message *hm, char *user, size_t user_len, + char *pass, size_t pass_len); +--- + +Gets and parses the Authorization: Basic header +Returns -1 if no Authorization header is found, or if +mg_parse_http_basic_auth +fails parsing the resulting header. + diff --git a/docs/c-api/mg_http_server.h/mg_get_http_header.md b/docs/c-api/mg_http_server.h/mg_get_http_header.md new file mode 100644 index 000000000..b33e91f48 --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_get_http_header.md @@ -0,0 +1,13 @@ +--- +title: "mg_get_http_header()" +decl_name: "mg_get_http_header" +symbol_kind: "func" +signature: | + struct mg_str *mg_get_http_header(struct http_message *hm, const char *name); +--- + +Searches and returns the header `name` in parsed HTTP message `hm`. +If header is not found, NULL is returned. Example: + + struct mg_str *host_hdr = mg_get_http_header(hm, "Host"); + diff --git a/docs/c-api/mg_http_server.h/mg_get_http_var.md b/docs/c-api/mg_http_server.h/mg_get_http_var.md new file mode 100644 index 000000000..8ca1d915d --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_get_http_var.md @@ -0,0 +1,17 @@ +--- +title: "mg_get_http_var()" +decl_name: "mg_get_http_var" +symbol_kind: "func" +signature: | + int mg_get_http_var(const struct mg_str *buf, const char *name, char *dst, + size_t dst_len); +--- + +Fetches a HTTP form variable. + +Fetches a variable `name` from a `buf` into a buffer specified by `dst`, +`dst_len`. The destination is always zero-terminated. Returns the length of +a fetched variable. If not found, 0 is returned. `buf` must be valid +url-encoded buffer. If destination is too small or an error occured, +negative number is returned. + diff --git a/docs/c-api/mg_http_server.h/mg_http_check_digest_auth.md b/docs/c-api/mg_http_server.h/mg_http_check_digest_auth.md new file mode 100644 index 000000000..3494eb261 --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_http_check_digest_auth.md @@ -0,0 +1,12 @@ +--- +title: "mg_http_check_digest_auth()" +decl_name: "mg_http_check_digest_auth" +symbol_kind: "func" +signature: | + int mg_http_check_digest_auth(struct http_message *hm, const char *auth_domain, + FILE *fp); +--- + +Authenticates a HTTP request against an opened password file. +Returns 1 if authenticated, 0 otherwise. + diff --git a/docs/c-api/mg_http_server.h/mg_http_parse_header.md b/docs/c-api/mg_http_server.h/mg_http_parse_header.md new file mode 100644 index 000000000..f86564536 --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_http_parse_header.md @@ -0,0 +1,23 @@ +--- +title: "mg_http_parse_header()" +decl_name: "mg_http_parse_header" +symbol_kind: "func" +signature: | + int mg_http_parse_header(struct mg_str *hdr, const char *var_name, char *buf, + size_t buf_size); +--- + +Parses the HTTP header `hdr`. Finds variable `var_name` and stores its value +in the buffer `buf`, `buf_size`. Returns 0 if variable not found, non-zero +otherwise. + +This function is supposed to parse cookies, authentication headers, etc. +Example (error handling omitted): + + char user[20]; + struct mg_str *hdr = mg_get_http_header(hm, "Authorization"); + mg_http_parse_header(hdr, "username", user, sizeof(user)); + +Returns the length of the variable's value. If buffer is not large enough, +or variable not found, 0 is returned. + diff --git a/docs/c-api/mg_http_server.h/mg_http_reverse_proxy.md b/docs/c-api/mg_http_server.h/mg_http_reverse_proxy.md new file mode 100644 index 000000000..c0c838358 --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_http_reverse_proxy.md @@ -0,0 +1,19 @@ +--- +title: "mg_http_reverse_proxy()" +decl_name: "mg_http_reverse_proxy" +symbol_kind: "func" +signature: | + void mg_http_reverse_proxy(struct mg_connection *nc, + const struct http_message *hm, struct mg_str mount, + struct mg_str upstream); +--- + +Proxies a given request to a given upstream http server. The path prefix +in `mount` will be stripped of the path requested to the upstream server, +e.g. if mount is /api and upstream is http://localhost:8001/foo +then an incoming request to /api/bar will cause a request to +http://localhost:8001/foo/bar + +EXPERIMENTAL API. Please use http_serve_http + url_rewrites if a static +mapping is good enough. + diff --git a/docs/c-api/mg_http_server.h/mg_http_send_error.md b/docs/c-api/mg_http_server.h/mg_http_send_error.md new file mode 100644 index 000000000..d74aafc14 --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_http_send_error.md @@ -0,0 +1,11 @@ +--- +title: "mg_http_send_error()" +decl_name: "mg_http_send_error" +symbol_kind: "func" +signature: | + void mg_http_send_error(struct mg_connection *nc, int code, const char *reason); +--- + +Sends an error response. If reason is NULL, the message will be inferred +from the error code (if supported). + diff --git a/docs/c-api/mg_http_server.h/mg_http_send_redirect.md b/docs/c-api/mg_http_server.h/mg_http_send_redirect.md new file mode 100644 index 000000000..00d704e0e --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_http_send_redirect.md @@ -0,0 +1,20 @@ +--- +title: "mg_http_send_redirect()" +decl_name: "mg_http_send_redirect" +symbol_kind: "func" +signature: | + void mg_http_send_redirect(struct mg_connection *nc, int status_code, + const struct mg_str location, + const struct mg_str extra_headers); +--- + +Sends a redirect response. +`status_code` should be either 301 or 302 and `location` point to the +new location. +If `extra_headers` is not empty, then `extra_headers` are also sent +after the response line. `extra_headers` must NOT end end with new line. + +Example: + + mg_http_send_redirect(nc, 302, mg_mk_str("/login"), mg_mk_str(NULL)); + diff --git a/docs/c-api/mg_http_server.h/mg_http_serve_file.md b/docs/c-api/mg_http_server.h/mg_http_serve_file.md new file mode 100644 index 000000000..440d39e5f --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_http_serve_file.md @@ -0,0 +1,28 @@ +--- +title: "mg_http_serve_file()" +decl_name: "mg_http_serve_file" +symbol_kind: "func" +signature: | + void mg_http_serve_file(struct mg_connection *nc, struct http_message *hm, + const char *path, const struct mg_str mime_type, + const struct mg_str extra_headers); +--- + +Serves a specific file with a given MIME type and optional extra headers. + +Example code snippet: + +```c +static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { + switch (ev) { + case MG_EV_HTTP_REQUEST: { + struct http_message *hm = (struct http_message *) ev_data; + mg_http_serve_file(nc, hm, "file.txt", + mg_mk_str("text/plain"), mg_mk_str("")); + break; + } + ... + } +} +``` + diff --git a/docs/c-api/mg_http_server.h/mg_parse_http.md b/docs/c-api/mg_http_server.h/mg_parse_http.md new file mode 100644 index 000000000..fdd5c638f --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_parse_http.md @@ -0,0 +1,15 @@ +--- +title: "mg_parse_http()" +decl_name: "mg_parse_http" +symbol_kind: "func" +signature: | + int mg_parse_http(const char *s, int n, struct http_message *hm, int is_req); +--- + +Parses a HTTP message. + +`is_req` should be set to 1 if parsing a request, 0 if reply. + +Returns the number of bytes parsed. If HTTP message is +incomplete `0` is returned. On parse error, a negative number is returned. + diff --git a/docs/c-api/mg_http_server.h/mg_parse_http_basic_auth.md b/docs/c-api/mg_http_server.h/mg_parse_http_basic_auth.md new file mode 100644 index 000000000..7e3c2118f --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_parse_http_basic_auth.md @@ -0,0 +1,13 @@ +--- +title: "mg_parse_http_basic_auth()" +decl_name: "mg_parse_http_basic_auth" +symbol_kind: "func" +signature: | + int mg_parse_http_basic_auth(struct mg_str *hdr, char *user, size_t user_len, + char *pass, size_t pass_len); +--- + +Parses the Authorization: Basic header +Returns -1 iif the authorization type is not "Basic" or any other error such +as incorrectly encoded base64 user password pair. + diff --git a/docs/c-api/mg_http_server.h/mg_parse_multipart.md b/docs/c-api/mg_http_server.h/mg_parse_multipart.md new file mode 100644 index 000000000..f98d48fad --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_parse_multipart.md @@ -0,0 +1,46 @@ +--- +title: "mg_parse_multipart()" +decl_name: "mg_parse_multipart" +symbol_kind: "func" +signature: | + size_t mg_parse_multipart(const char *buf, size_t buf_len, char *var_name, + size_t var_name_len, char *file_name, + size_t file_name_len, const char **chunk, + size_t *chunk_len); +--- + +Parses the buffer `buf`, `buf_len` that contains multipart form data chunks. +Stores the chunk name in a `var_name`, `var_name_len` buffer. +If a chunk is an uploaded file, then `file_name`, `file_name_len` is +filled with an uploaded file name. `chunk`, `chunk_len` +points to the chunk data. + +Return: number of bytes to skip to the next chunk or 0 if there are + no more chunks. + +Usage example: + +```c + static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { + switch(ev) { + case MG_EV_HTTP_REQUEST: { + struct http_message *hm = (struct http_message *) ev_data; + char var_name[100], file_name[100]; + const char *chunk; + size_t chunk_len, n1, n2; + + n1 = n2 = 0; + while ((n2 = mg_parse_multipart(hm->body.p + n1, + hm->body.len - n1, + var_name, sizeof(var_name), + file_name, sizeof(file_name), + &chunk, &chunk_len)) > 0) { + printf("var: %s, file_name: %s, size: %d, chunk: [%.*s]\n", + var_name, file_name, (int) chunk_len, + (int) chunk_len, chunk); + n1 += n2; + } + } + break; +``` + diff --git a/docs/c-api/mg_http_server.h/mg_printf_html_escape.md b/docs/c-api/mg_http_server.h/mg_printf_html_escape.md new file mode 100644 index 000000000..6238e28d1 --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_printf_html_escape.md @@ -0,0 +1,10 @@ +--- +title: "mg_printf_html_escape()" +decl_name: "mg_printf_html_escape" +symbol_kind: "func" +signature: | + void mg_printf_html_escape(struct mg_connection *nc, const char *fmt, ...); +--- + +Sends a printf-formatted HTTP chunk, escaping HTML tags. + diff --git a/docs/c-api/mg_http_server.h/mg_printf_http_chunk.md b/docs/c-api/mg_http_server.h/mg_printf_http_chunk.md new file mode 100644 index 000000000..f99324b23 --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_printf_http_chunk.md @@ -0,0 +1,11 @@ +--- +title: "mg_printf_http_chunk()" +decl_name: "mg_printf_http_chunk" +symbol_kind: "func" +signature: | + void mg_printf_http_chunk(struct mg_connection *nc, const char *fmt, ...); +--- + +Sends a printf-formatted HTTP chunk. +Functionality is similar to `mg_send_http_chunk()`. + diff --git a/docs/c-api/mg_http_server.h/mg_register_http_endpoint.md b/docs/c-api/mg_http_server.h/mg_register_http_endpoint.md new file mode 100644 index 000000000..394bbb51e --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_register_http_endpoint.md @@ -0,0 +1,36 @@ +--- +title: "mg_register_http_endpoint()" +decl_name: "mg_register_http_endpoint" +symbol_kind: "func" +signature: | + void mg_register_http_endpoint(struct mg_connection *nc, const char *uri_path, + MG_CB(mg_event_handler_t handler, + void *user_data); +--- + +Registers a callback for a specified http endpoint +Note: if callback is registered it is called instead of the +callback provided in mg_bind + +Example code snippet: + +```c +static void handle_hello1(struct mg_connection *nc, int ev, void *ev_data) { + (void) ev; (void) ev_data; + mg_printf(nc, "HTTP/1.0 200 OK\r\n\r\n[I am Hello1]"); + nc->flags |= MG_F_SEND_AND_CLOSE; +} + +static void handle_hello2(struct mg_connection *nc, int ev, void *ev_data) { + (void) ev; (void) ev_data; + mg_printf(nc, "HTTP/1.0 200 OK\r\n\r\n[I am Hello2]"); + nc->flags |= MG_F_SEND_AND_CLOSE; +} + +void init() { + nc = mg_bind(&mgr, local_addr, cb1); + mg_register_http_endpoint(nc, "/hello1", handle_hello1); + mg_register_http_endpoint(nc, "/hello1/hello2", handle_hello2); +} +``` + diff --git a/docs/c-api/mg_http_server.h/mg_send_head.md b/docs/c-api/mg_http_server.h/mg_send_head.md new file mode 100644 index 000000000..cd3348668 --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_send_head.md @@ -0,0 +1,22 @@ +--- +title: "mg_send_head()" +decl_name: "mg_send_head" +symbol_kind: "func" +signature: | + void mg_send_head(struct mg_connection *n, int status_code, + int64_t content_length, const char *extra_headers); +--- + +Sends the response line and headers. +This function sends the response line with the `status_code`, and +automatically +sends one header: either "Content-Length" or "Transfer-Encoding". +If `content_length` is negative, then "Transfer-Encoding: chunked" header +is sent, otherwise, "Content-Length" header is sent. + +NOTE: If `Transfer-Encoding` is `chunked`, then message body must be sent +using `mg_send_http_chunk()` or `mg_printf_http_chunk()` functions. +Otherwise, `mg_send()` or `mg_printf()` must be used. +Extra headers could be set through `extra_headers`. Note `extra_headers` +must NOT be terminated by a new line. + diff --git a/docs/c-api/mg_http_server.h/mg_send_http_chunk.md b/docs/c-api/mg_http_server.h/mg_send_http_chunk.md new file mode 100644 index 000000000..6a2a4d838 --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_send_http_chunk.md @@ -0,0 +1,25 @@ +--- +title: "mg_send_http_chunk()" +decl_name: "mg_send_http_chunk" +symbol_kind: "func" +signature: | + void mg_send_http_chunk(struct mg_connection *nc, const char *buf, size_t len); +--- + +Sends buffer `buf` of size `len` to the client using chunked HTTP encoding. +This function sends the buffer size as hex number + newline first, then +the buffer itself, then the newline. For example, +`mg_send_http_chunk(nc, "foo", 3)` will append the `3\r\nfoo\r\n` string +to the `nc->send_mbuf` output IO buffer. + +NOTE: The HTTP header "Transfer-Encoding: chunked" should be sent prior to +using this function. + +NOTE: do not forget to send an empty chunk at the end of the response, +to tell the client that everything was sent. Example: + +``` + mg_printf_http_chunk(nc, "%s", "my response!"); + mg_send_http_chunk(nc, "", 0); // Tell the client we're finished +``` + diff --git a/docs/c-api/mg_http_server.h/mg_send_response_line.md b/docs/c-api/mg_http_server.h/mg_send_response_line.md new file mode 100644 index 000000000..5daa74fe8 --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_send_response_line.md @@ -0,0 +1,21 @@ +--- +title: "mg_send_response_line()" +decl_name: "mg_send_response_line" +symbol_kind: "func" +signature: | + void mg_send_response_line(struct mg_connection *nc, int status_code, + const char *extra_headers); +--- + +Sends the response status line. +If `extra_headers` is not NULL, then `extra_headers` are also sent +after the response line. `extra_headers` must NOT end end with new line. +Example: + + mg_send_response_line(nc, 200, "Access-Control-Allow-Origin: *"); + +Will result in: + + HTTP/1.1 200 OK\r\n + Access-Control-Allow-Origin: *\r\n + diff --git a/docs/c-api/mg_http_server.h/mg_serve_http.md b/docs/c-api/mg_http_server.h/mg_serve_http.md new file mode 100644 index 000000000..980695036 --- /dev/null +++ b/docs/c-api/mg_http_server.h/mg_serve_http.md @@ -0,0 +1,28 @@ +--- +title: "mg_serve_http()" +decl_name: "mg_serve_http" +symbol_kind: "func" +signature: | + void mg_serve_http(struct mg_connection *nc, struct http_message *hm, + struct mg_serve_http_opts opts); +--- + +Serves given HTTP request according to the `options`. + +Example code snippet: + +```c +static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { + struct http_message *hm = (struct http_message *) ev_data; + struct mg_serve_http_opts opts = { .document_root = "/var/www" }; // C99 + + switch (ev) { + case MG_EV_HTTP_REQUEST: + mg_serve_http(nc, hm, opts); + break; + default: + break; + } +} +``` + diff --git a/docs/c-api/mg_http_server.h/struct_mg_serve_http_opts.md b/docs/c-api/mg_http_server.h/struct_mg_serve_http_opts.md new file mode 100644 index 000000000..ae594dba6 --- /dev/null +++ b/docs/c-api/mg_http_server.h/struct_mg_serve_http_opts.md @@ -0,0 +1,165 @@ +--- +title: "struct mg_serve_http_opts" +decl_name: "struct mg_serve_http_opts" +symbol_kind: "struct" +signature: | + struct mg_serve_http_opts { + /* Path to web root directory */ + const char *document_root; + + /* List of index files. Default is "" */ + const char *index_files; + + /* + * Leave as NULL to disable authentication. + * To enable directory protection with authentication, set this to ".htpasswd" + * Then, creating ".htpasswd" file in any directory automatically protects + * it with digest authentication. + * Use `mongoose` web server binary, or `htdigest` Apache utility to + * create/manipulate passwords file. + * Make sure `auth_domain` is set to a valid domain name. + */ + const char *per_directory_auth_file; + + /* Authorization domain (domain name of this web server) */ + const char *auth_domain; + + /* + * Leave as NULL to disable authentication. + * Normally, only selected directories in the document root are protected. + * If absolutely every access to the web server needs to be authenticated, + * regardless of the URI, set this option to the path to the passwords file. + * Format of that file is the same as ".htpasswd" file. Make sure that file + * is located outside document root to prevent people fetching it. + */ + const char *global_auth_file; + + /* Set to "no" to disable directory listing. Enabled by default. */ + const char *enable_directory_listing; + + /* + * SSI files pattern. If not set, "**.shtml$|**.shtm$" is used. + * + * All files that match ssi_pattern are treated as SSI. + * + * Server Side Includes (SSI) is a simple interpreted server-side scripting + * language which is most commonly used to include the contents of a file + * into a web page. It can be useful when it is desirable to include a common + * piece of code throughout a website, for example, headers and footers. + * + * In order for a webpage to recognize an SSI-enabled HTML file, the + * filename should end with a special extension, by default the extension + * should be either .shtml or .shtm + * + * Unknown SSI directives are silently ignored by Mongoose. Currently, + * the following SSI directives are supported: + * <!--#include FILE_TO_INCLUDE --> + * <!--#exec "COMMAND_TO_EXECUTE" --> + * <!--#call COMMAND --> + * + * Note that <!--#include ...> directive supports three path + *specifications: + * + * <!--#include virtual="path" --> Path is relative to web server root + * <!--#include abspath="path" --> Path is absolute or relative to the + * web server working dir + * <!--#include file="path" -->, Path is relative to current document + * <!--#include "path" --> + * + * The include directive may be used to include the contents of a file or + * the result of running a CGI script. + * + * The exec directive is used to execute + * a command on a server, and show command's output. Example: + * + * <!--#exec "ls -l" --> + * + * The call directive is a way to invoke a C handler from the HTML page. + * On each occurence of <!--#call COMMAND OPTIONAL_PARAMS> directive, + * Mongoose calls a registered event handler with MG_EV_SSI_CALL event, + * and event parameter will point to the COMMAND OPTIONAL_PARAMS string. + * An event handler can output any text, for example by calling + * `mg_printf()`. This is a flexible way of generating a web page on + * server side by calling a C event handler. Example: + * + * <!--#call foo --> ... <!--#call bar --> + * + * In the event handler: + * case MG_EV_SSI_CALL: { + * const char *param = (const char *) ev_data; + * if (strcmp(param, "foo") == 0) { + * mg_printf(c, "hello from foo"); + * } else if (strcmp(param, "bar") == 0) { + * mg_printf(c, "hello from bar"); + * } + * break; + * } + */ + const char *ssi_pattern; + + /* IP ACL. By default, NULL, meaning all IPs are allowed to connect */ + const char *ip_acl; + + #if MG_ENABLE_HTTP_URL_REWRITES + /* URL rewrites. + * + * Comma-separated list of `uri_pattern=url_file_or_directory_path` rewrites. + * When HTTP request is received, Mongoose constructs a file name from the + * requested URI by combining `document_root` and the URI. However, if the + * rewrite option is used and `uri_pattern` matches requested URI, then + * `document_root` is ignored. Instead, `url_file_or_directory_path` is used, + * which should be a full path name or a path relative to the web server's + * current working directory. It can also be an URI (http:// or https://) + * in which case mongoose will behave as a reverse proxy for that destination. + * + * Note that `uri_pattern`, as all Mongoose patterns, is a prefix pattern. + * + * If uri_pattern starts with `@` symbol, then Mongoose compares it with the + * HOST header of the request. If they are equal, Mongoose sets document root + * to `file_or_directory_path`, implementing virtual hosts support. + * Example: `@foo.com=/document/root/for/foo.com` + * + * If `uri_pattern` starts with `%` symbol, then Mongoose compares it with + * the listening port. If they match, then Mongoose issues a 301 redirect. + * For example, to redirect all HTTP requests to the + * HTTPS port, do `%80=https://my.site.com`. Note that the request URI is + * automatically appended to the redirect location. + */ + const char *url_rewrites; + #endif + + /* DAV document root. If NULL, DAV requests are going to fail. */ + const char *dav_document_root; + + /* + * DAV passwords file. If NULL, DAV requests are going to fail. + * If passwords file is set to "-", then DAV auth is disabled. + */ + const char *dav_auth_file; + + /* Glob pattern for the files to hide. */ + const char *hidden_file_pattern; + + /* Set to non-NULL to enable CGI, e.g. **.cgi$|**.php$" */ + const char *cgi_file_pattern; + + /* If not NULL, ignore CGI script hashbang and use this interpreter */ + const char *cgi_interpreter; + + /* + * Comma-separated list of Content-Type overrides for path suffixes, e.g. + * ".txt=text/plain; charset=utf-8,.c=text/plain" + */ + const char *custom_mime_types; + + /* + * Extra HTTP headers to add to each server response. + * Example: to enable CORS, set this to "Access-Control-Allow-Origin: *". + */ + const char *extra_headers; + }; +--- + +This structure defines how `mg_serve_http()` works. +Best practice is to set only required settings, and leave the rest as NULL. + diff --git a/docs/c-api/mg_mqtt.h/intro.md b/docs/c-api/mg_mqtt.h/intro.md new file mode 100644 index 000000000..eee90dfe2 --- /dev/null +++ b/docs/c-api/mg_mqtt.h/intro.md @@ -0,0 +1,29 @@ +--- +title: "MQTT API reference" +symbol_kind: "intro" +decl_name: "mg_mqtt.h" +items: + - { name: mg_mqtt_connack.md } + - { name: mg_mqtt_disconnect.md } + - { name: mg_mqtt_match_topic_expression.md } + - { name: mg_mqtt_next_subscribe_topic.md } + - { name: mg_mqtt_ping.md } + - { name: mg_mqtt_pong.md } + - { name: mg_mqtt_puback.md } + - { name: mg_mqtt_pubcomp.md } + - { name: mg_mqtt_publish.md } + - { name: mg_mqtt_pubrec.md } + - { name: mg_mqtt_pubrel.md } + - { name: mg_mqtt_suback.md } + - { name: mg_mqtt_subscribe.md } + - { name: mg_mqtt_unsuback.md } + - { name: mg_mqtt_unsubscribe.md } + - { name: mg_mqtt_vmatch_topic_expression.md } + - { name: mg_send_mqtt_handshake.md } + - { name: mg_send_mqtt_handshake_opt.md } + - { name: mg_set_protocol_mqtt.md } + - { name: struct_mg_mqtt_proto_data.md } +--- + + + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_connack.md b/docs/c-api/mg_mqtt.h/mg_mqtt_connack.md new file mode 100644 index 000000000..7daaf5b42 --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_connack.md @@ -0,0 +1,10 @@ +--- +title: "mg_mqtt_connack()" +decl_name: "mg_mqtt_connack" +symbol_kind: "func" +signature: | + void mg_mqtt_connack(struct mg_connection *nc, uint8_t return_code); +--- + +Sends a CONNACK command with a given `return_code`. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_disconnect.md b/docs/c-api/mg_mqtt.h/mg_mqtt_disconnect.md new file mode 100644 index 000000000..c727cad06 --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_disconnect.md @@ -0,0 +1,10 @@ +--- +title: "mg_mqtt_disconnect()" +decl_name: "mg_mqtt_disconnect" +symbol_kind: "func" +signature: | + void mg_mqtt_disconnect(struct mg_connection *nc); +--- + +Sends a DISCONNECT command. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_match_topic_expression.md b/docs/c-api/mg_mqtt.h/mg_mqtt_match_topic_expression.md new file mode 100644 index 000000000..81575b47f --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_match_topic_expression.md @@ -0,0 +1,12 @@ +--- +title: "mg_mqtt_match_topic_expression()" +decl_name: "mg_mqtt_match_topic_expression" +symbol_kind: "func" +signature: | + int mg_mqtt_match_topic_expression(struct mg_str exp, struct mg_str topic); +--- + +Matches a topic against a topic expression + +Returns 1 if it matches; 0 otherwise. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_next_subscribe_topic.md b/docs/c-api/mg_mqtt.h/mg_mqtt_next_subscribe_topic.md new file mode 100644 index 000000000..ccb96e620 --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_next_subscribe_topic.md @@ -0,0 +1,15 @@ +--- +title: "mg_mqtt_next_subscribe_topic()" +decl_name: "mg_mqtt_next_subscribe_topic" +symbol_kind: "func" +signature: | + int mg_mqtt_next_subscribe_topic(struct mg_mqtt_message *msg, + struct mg_str *topic, uint8_t *qos, int pos); +--- + +Extracts the next topic expression from a SUBSCRIBE command payload. + +The topic expression name will point to a string in the payload buffer. +Returns the pos of the next topic expression or -1 when the list +of topics is exhausted. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_ping.md b/docs/c-api/mg_mqtt.h/mg_mqtt_ping.md new file mode 100644 index 000000000..757a825ee --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_ping.md @@ -0,0 +1,10 @@ +--- +title: "mg_mqtt_ping()" +decl_name: "mg_mqtt_ping" +symbol_kind: "func" +signature: | + void mg_mqtt_ping(struct mg_connection *nc); +--- + +Sends a PINGREQ command. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_pong.md b/docs/c-api/mg_mqtt.h/mg_mqtt_pong.md new file mode 100644 index 000000000..c79253e3e --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_pong.md @@ -0,0 +1,10 @@ +--- +title: "mg_mqtt_pong()" +decl_name: "mg_mqtt_pong" +symbol_kind: "func" +signature: | + void mg_mqtt_pong(struct mg_connection *nc); +--- + +Sends a PINGRESP command. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_puback.md b/docs/c-api/mg_mqtt.h/mg_mqtt_puback.md new file mode 100644 index 000000000..a29a352d2 --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_puback.md @@ -0,0 +1,10 @@ +--- +title: "mg_mqtt_puback()" +decl_name: "mg_mqtt_puback" +symbol_kind: "func" +signature: | + void mg_mqtt_puback(struct mg_connection *nc, uint16_t message_id); +--- + +Sends a PUBACK command with a given `message_id`. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_pubcomp.md b/docs/c-api/mg_mqtt.h/mg_mqtt_pubcomp.md new file mode 100644 index 000000000..bc3228ca9 --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_pubcomp.md @@ -0,0 +1,10 @@ +--- +title: "mg_mqtt_pubcomp()" +decl_name: "mg_mqtt_pubcomp" +symbol_kind: "func" +signature: | + void mg_mqtt_pubcomp(struct mg_connection *nc, uint16_t message_id); +--- + +Sends a PUBCOMP command with a given `message_id`. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_publish.md b/docs/c-api/mg_mqtt.h/mg_mqtt_publish.md new file mode 100644 index 000000000..b2a7b013b --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_publish.md @@ -0,0 +1,12 @@ +--- +title: "mg_mqtt_publish()" +decl_name: "mg_mqtt_publish" +symbol_kind: "func" +signature: | + void mg_mqtt_publish(struct mg_connection *nc, const char *topic, + uint16_t message_id, int flags, const void *data, + size_t len); +--- + +Publishes a message to a given topic. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_pubrec.md b/docs/c-api/mg_mqtt.h/mg_mqtt_pubrec.md new file mode 100644 index 000000000..16cdc7d0d --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_pubrec.md @@ -0,0 +1,10 @@ +--- +title: "mg_mqtt_pubrec()" +decl_name: "mg_mqtt_pubrec" +symbol_kind: "func" +signature: | + void mg_mqtt_pubrec(struct mg_connection *nc, uint16_t message_id); +--- + +Sends a PUBREC command with a given `message_id`. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_pubrel.md b/docs/c-api/mg_mqtt.h/mg_mqtt_pubrel.md new file mode 100644 index 000000000..18a6c5813 --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_pubrel.md @@ -0,0 +1,10 @@ +--- +title: "mg_mqtt_pubrel()" +decl_name: "mg_mqtt_pubrel" +symbol_kind: "func" +signature: | + void mg_mqtt_pubrel(struct mg_connection *nc, uint16_t message_id); +--- + +Sends a PUBREL command with a given `message_id`. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_suback.md b/docs/c-api/mg_mqtt.h/mg_mqtt_suback.md new file mode 100644 index 000000000..55cf5e3a2 --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_suback.md @@ -0,0 +1,12 @@ +--- +title: "mg_mqtt_suback()" +decl_name: "mg_mqtt_suback" +symbol_kind: "func" +signature: | + void mg_mqtt_suback(struct mg_connection *nc, uint8_t *qoss, size_t qoss_len, + uint16_t message_id); +--- + +Sends a SUBACK command with a given `message_id` +and a sequence of granted QoSs. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_subscribe.md b/docs/c-api/mg_mqtt.h/mg_mqtt_subscribe.md new file mode 100644 index 000000000..0168db410 --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_subscribe.md @@ -0,0 +1,12 @@ +--- +title: "mg_mqtt_subscribe()" +decl_name: "mg_mqtt_subscribe" +symbol_kind: "func" +signature: | + void mg_mqtt_subscribe(struct mg_connection *nc, + const struct mg_mqtt_topic_expression *topics, + size_t topics_len, uint16_t message_id); +--- + +Subscribes to a bunch of topics. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_unsuback.md b/docs/c-api/mg_mqtt.h/mg_mqtt_unsuback.md new file mode 100644 index 000000000..a86fffc51 --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_unsuback.md @@ -0,0 +1,10 @@ +--- +title: "mg_mqtt_unsuback()" +decl_name: "mg_mqtt_unsuback" +symbol_kind: "func" +signature: | + void mg_mqtt_unsuback(struct mg_connection *nc, uint16_t message_id); +--- + +Sends a UNSUBACK command with a given `message_id`. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_unsubscribe.md b/docs/c-api/mg_mqtt.h/mg_mqtt_unsubscribe.md new file mode 100644 index 000000000..b4c1f783b --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_unsubscribe.md @@ -0,0 +1,11 @@ +--- +title: "mg_mqtt_unsubscribe()" +decl_name: "mg_mqtt_unsubscribe" +symbol_kind: "func" +signature: | + void mg_mqtt_unsubscribe(struct mg_connection *nc, char **topics, + size_t topics_len, uint16_t message_id); +--- + +Unsubscribes from a bunch of topics. + diff --git a/docs/c-api/mg_mqtt.h/mg_mqtt_vmatch_topic_expression.md b/docs/c-api/mg_mqtt.h/mg_mqtt_vmatch_topic_expression.md new file mode 100644 index 000000000..4b0a42315 --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_mqtt_vmatch_topic_expression.md @@ -0,0 +1,11 @@ +--- +title: "mg_mqtt_vmatch_topic_expression()" +decl_name: "mg_mqtt_vmatch_topic_expression" +symbol_kind: "func" +signature: | + int mg_mqtt_vmatch_topic_expression(const char *exp, struct mg_str topic); +--- + +Same as `mg_mqtt_match_topic_expression()`, but takes `exp` as a +NULL-terminated string. + diff --git a/docs/c-api/mg_mqtt.h/mg_send_mqtt_handshake.md b/docs/c-api/mg_mqtt.h/mg_send_mqtt_handshake.md new file mode 100644 index 000000000..0e75c4e31 --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_send_mqtt_handshake.md @@ -0,0 +1,10 @@ +--- +title: "mg_send_mqtt_handshake()" +decl_name: "mg_send_mqtt_handshake" +symbol_kind: "func" +signature: | + void mg_send_mqtt_handshake(struct mg_connection *nc, const char *client_id); +--- + +Sends an MQTT handshake. + diff --git a/docs/c-api/mg_mqtt.h/mg_send_mqtt_handshake_opt.md b/docs/c-api/mg_mqtt.h/mg_send_mqtt_handshake_opt.md new file mode 100644 index 000000000..2c7a93ca6 --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_send_mqtt_handshake_opt.md @@ -0,0 +1,11 @@ +--- +title: "mg_send_mqtt_handshake_opt()" +decl_name: "mg_send_mqtt_handshake_opt" +symbol_kind: "func" +signature: | + void mg_send_mqtt_handshake_opt(struct mg_connection *nc, const char *client_id, + struct mg_send_mqtt_handshake_opts); +--- + +Sends an MQTT handshake with optional parameters. + diff --git a/docs/c-api/mg_mqtt.h/mg_set_protocol_mqtt.md b/docs/c-api/mg_mqtt.h/mg_set_protocol_mqtt.md new file mode 100644 index 000000000..8c65d385a --- /dev/null +++ b/docs/c-api/mg_mqtt.h/mg_set_protocol_mqtt.md @@ -0,0 +1,20 @@ +--- +title: "mg_set_protocol_mqtt()" +decl_name: "mg_set_protocol_mqtt" +symbol_kind: "func" +signature: | + void mg_set_protocol_mqtt(struct mg_connection *nc); +--- + +Attaches a built-in MQTT event handler to the given connection. + +The user-defined event handler will receive following extra events: + +- MG_EV_MQTT_CONNACK +- MG_EV_MQTT_PUBLISH +- MG_EV_MQTT_PUBACK +- MG_EV_MQTT_PUBREC +- MG_EV_MQTT_PUBREL +- MG_EV_MQTT_PUBCOMP +- MG_EV_MQTT_SUBACK + diff --git a/docs/c-api/mg_mqtt.h/struct_mg_mqtt_proto_data.md b/docs/c-api/mg_mqtt.h/struct_mg_mqtt_proto_data.md new file mode 100644 index 000000000..f095589d2 --- /dev/null +++ b/docs/c-api/mg_mqtt.h/struct_mg_mqtt_proto_data.md @@ -0,0 +1,13 @@ +--- +title: "struct mg_mqtt_proto_data" +decl_name: "struct mg_mqtt_proto_data" +symbol_kind: "struct" +signature: | + struct mg_mqtt_proto_data { + uint16_t keep_alive; + double last_control_time; + }; +--- + +mg_mqtt_proto_data should be in header to allow external access to it + diff --git a/docs/c-api/mg_mqtt_server.h/LIST_ENTRY.md b/docs/c-api/mg_mqtt_server.h/LIST_ENTRY.md new file mode 100644 index 000000000..3d30ddd31 --- /dev/null +++ b/docs/c-api/mg_mqtt_server.h/LIST_ENTRY.md @@ -0,0 +1,10 @@ +--- +title: "LIST_ENTRY()" +decl_name: "LIST_ENTRY" +symbol_kind: "func" +signature: | + LIST_ENTRY(mg_mqtt_session); +--- + +Broker + diff --git a/docs/c-api/mg_mqtt_server.h/intro.md b/docs/c-api/mg_mqtt_server.h/intro.md new file mode 100644 index 000000000..0c2b2b7cd --- /dev/null +++ b/docs/c-api/mg_mqtt_server.h/intro.md @@ -0,0 +1,12 @@ +--- +title: "MQTT Server API reference" +symbol_kind: "intro" +decl_name: "mg_mqtt_server.h" +items: + - { name: LIST_ENTRY.md } + - { name: struct_mg_mqtt_broker.md } + - { name: struct_mg_mqtt_session.md } +--- + + + diff --git a/docs/c-api/mg_mqtt_server.h/struct_mg_mqtt_broker.md b/docs/c-api/mg_mqtt_server.h/struct_mg_mqtt_broker.md new file mode 100644 index 000000000..eaaa637f7 --- /dev/null +++ b/docs/c-api/mg_mqtt_server.h/struct_mg_mqtt_broker.md @@ -0,0 +1,13 @@ +--- +title: "struct mg_mqtt_broker" +decl_name: "struct mg_mqtt_broker" +symbol_kind: "struct" +signature: | + struct mg_mqtt_broker { + LIST_HEAD(_mg_sesshead, mg_mqtt_session) sessions; /* Session list */ + void *user_data; /* User data */ + }; +--- + +MQTT broker. + diff --git a/docs/c-api/mg_mqtt_server.h/struct_mg_mqtt_session.md b/docs/c-api/mg_mqtt_server.h/struct_mg_mqtt_session.md new file mode 100644 index 000000000..e38a4dfad --- /dev/null +++ b/docs/c-api/mg_mqtt_server.h/struct_mg_mqtt_session.md @@ -0,0 +1,17 @@ +--- +title: "struct mg_mqtt_session" +decl_name: "struct mg_mqtt_session" +symbol_kind: "struct" +signature: | + struct mg_mqtt_session { + struct mg_mqtt_broker *brk; /* Broker */ + LIST_ENTRY(mg_mqtt_session) link; /* mg_mqtt_broker::sessions linkage */ + struct mg_connection *nc; /* Connection with the client */ + size_t num_subscriptions; /* Size of `subscriptions` array */ + void *user_data; /* User data */ + struct mg_mqtt_topic_expression *subscriptions; + }; +--- + +MQTT session (Broker side). + diff --git a/docs/c-api/mg_net.h/intro.md b/docs/c-api/mg_net.h/intro.md new file mode 100644 index 000000000..5caca87cf --- /dev/null +++ b/docs/c-api/mg_net.h/intro.md @@ -0,0 +1,41 @@ +--- +title: "Core API: TCP/UDP/SSL" +symbol_kind: "intro" +decl_name: "mg_net.h" +items: + - { name: mg_add_sock.md } + - { name: mg_add_sock_opt.md } + - { name: mg_bind.md } + - { name: mg_bind_opt.md } + - { name: mg_broadcast.md } + - { name: mg_check_ip_acl.md } + - { name: mg_connect.md } + - { name: mg_connect_opt.md } + - { name: mg_mgr_free.md } + - { name: mg_mgr_init.md } + - { name: mg_mgr_init_opt.md } + - { name: mg_mgr_poll.md } + - { name: mg_next.md } + - { name: mg_printf.md } + - { name: mg_resolve.md } + - { name: mg_send.md } + - { name: mg_set_ssl.md } + - { name: mg_set_timer.md } + - { name: mg_socketpair.md } + - { name: mg_time.md } + - { name: mg_vprintf.md } + - { name: mg_event_handler_t.md } + - { name: struct_mg_add_sock_opts.md } + - { name: struct_mg_bind_opts.md } + - { name: struct_mg_connect_opts.md } + - { name: struct_mg_connection.md } + - { name: struct_mg_mgr.md } + - { name: struct_mg_mgr_init_opts.md } +--- + +NOTE: Mongoose manager is single threaded. It does not protect +its data structures by mutexes, therefore all functions that are dealing +with a particular event manager should be called from the same thread, +with exception of the `mg_broadcast()` function. It is fine to have different +event managers handled by different threads. + diff --git a/docs/c-api/mg_net.h/mg_add_sock.md b/docs/c-api/mg_net.h/mg_add_sock.md new file mode 100644 index 000000000..e63ce2e48 --- /dev/null +++ b/docs/c-api/mg_net.h/mg_add_sock.md @@ -0,0 +1,15 @@ +--- +title: "mg_add_sock()" +decl_name: "mg_add_sock" +symbol_kind: "func" +signature: | + struct mg_connection *mg_add_sock(struct mg_mgr *mgr, sock_t sock, + MG_CB(mg_event_handler_t handler, + void *user_data); +--- + +Creates a connection, associates it with the given socket and event handler +and adds it to the manager. + +For more options see the `mg_add_sock_opt` variant. + diff --git a/docs/c-api/mg_net.h/mg_add_sock_opt.md b/docs/c-api/mg_net.h/mg_add_sock_opt.md new file mode 100644 index 000000000..de2a22e9f --- /dev/null +++ b/docs/c-api/mg_net.h/mg_add_sock_opt.md @@ -0,0 +1,15 @@ +--- +title: "mg_add_sock_opt()" +decl_name: "mg_add_sock_opt" +symbol_kind: "func" +signature: | + struct mg_connection *mg_add_sock_opt(struct mg_mgr *mgr, sock_t sock, + MG_CB(mg_event_handler_t handler, + void *user_data); +--- + +Creates a connection, associates it with the given socket and event handler +and adds to the manager. + +See the `mg_add_sock_opts` structure for a description of the options. + diff --git a/docs/c-api/mg_net.h/mg_bind.md b/docs/c-api/mg_net.h/mg_bind.md new file mode 100644 index 000000000..9507d51c5 --- /dev/null +++ b/docs/c-api/mg_net.h/mg_bind.md @@ -0,0 +1,14 @@ +--- +title: "mg_bind()" +decl_name: "mg_bind" +symbol_kind: "func" +signature: | + struct mg_connection *mg_bind(struct mg_mgr *mgr, const char *address, + MG_CB(mg_event_handler_t handler, + void *user_data); +--- + +Creates a listening connection. + +See `mg_bind_opt` for full documentation. + diff --git a/docs/c-api/mg_net.h/mg_bind_opt.md b/docs/c-api/mg_net.h/mg_bind_opt.md new file mode 100644 index 000000000..823dd0c0a --- /dev/null +++ b/docs/c-api/mg_net.h/mg_bind_opt.md @@ -0,0 +1,27 @@ +--- +title: "mg_bind_opt()" +decl_name: "mg_bind_opt" +symbol_kind: "func" +signature: | + struct mg_connection *mg_bind_opt(struct mg_mgr *mgr, const char *address, + MG_CB(mg_event_handler_t handler, + void *user_data); +--- + +Creates a listening connection. + +The `address` parameter specifies which address to bind to. It's format is +the same as for the `mg_connect()` call, where `HOST` part is optional. +`address` can be just a port number, e.g. `:8000`. To bind to a specific +interface, an IP address can be specified, e.g. `1.2.3.4:8000`. By default, +a TCP connection is created. To create UDP connection, prepend `udp://` +prefix, e.g. `udp://:8000`. To summarize, `address` parameter has following +format: `[PROTO://][IP_ADDRESS]:PORT`, where `PROTO` could be `tcp` or +`udp`. + +See the `mg_bind_opts` structure for a description of the optional +parameters. + +Returns a new listening connection or `NULL` on error. +NOTE: The connection remains owned by the manager, do not free(). + diff --git a/docs/c-api/mg_net.h/mg_broadcast.md b/docs/c-api/mg_net.h/mg_broadcast.md new file mode 100644 index 000000000..cef0b379c --- /dev/null +++ b/docs/c-api/mg_net.h/mg_broadcast.md @@ -0,0 +1,20 @@ +--- +title: "mg_broadcast()" +decl_name: "mg_broadcast" +symbol_kind: "func" +signature: | + void mg_broadcast(struct mg_mgr *mgr, mg_event_handler_t cb, void *data, + size_t len); +--- + +Passes a message of a given length to all connections. + +Must be called from a thread that does NOT call `mg_mgr_poll()`. +Note that `mg_broadcast()` is the only function +that can be, and must be, called from a different (non-IO) thread. + +`func` callback function will be called by the IO thread for each +connection. When called, the event will be `MG_EV_POLL`, and a message will +be passed as the `ev_data` pointer. Maximum message size is capped +by `MG_CTL_MSG_MESSAGE_SIZE` which is set to 8192 bytes. + diff --git a/docs/c-api/mg_net.h/mg_check_ip_acl.md b/docs/c-api/mg_net.h/mg_check_ip_acl.md new file mode 100644 index 000000000..83c2c7ba2 --- /dev/null +++ b/docs/c-api/mg_net.h/mg_check_ip_acl.md @@ -0,0 +1,27 @@ +--- +title: "mg_check_ip_acl()" +decl_name: "mg_check_ip_acl" +symbol_kind: "func" +signature: | + int mg_check_ip_acl(const char *acl, uint32_t remote_ip); +--- + +Verify given IP address against the ACL. + +`remote_ip` - an IPv4 address to check, in host byte order +`acl` - a comma separated list of IP subnets: `x.x.x.x/x` or `x.x.x.x`. +Each subnet is +prepended by either a - or a + sign. A plus sign means allow, where a +minus sign means deny. If a subnet mask is omitted, such as `-1.2.3.4`, +it means that only that single IP address is denied. +Subnet masks may vary from 0 to 32, inclusive. The default setting +is to allow all access. On each request the full list is traversed, +and the last match wins. Example: + +`-0.0.0.0/0,+192.168/16` - deny all accesses, only allow 192.168/16 subnet + +To learn more about subnet masks, see this +link:https://en.wikipedia.org/wiki/Subnetwork[Wikipedia page on Subnetwork]. + +Returns -1 if ACL is malformed, 0 if address is disallowed, 1 if allowed. + diff --git a/docs/c-api/mg_net.h/mg_connect.md b/docs/c-api/mg_net.h/mg_connect.md new file mode 100644 index 000000000..788be84e6 --- /dev/null +++ b/docs/c-api/mg_net.h/mg_connect.md @@ -0,0 +1,14 @@ +--- +title: "mg_connect()" +decl_name: "mg_connect" +symbol_kind: "func" +signature: | + struct mg_connection *mg_connect(struct mg_mgr *mgr, const char *address, + MG_CB(mg_event_handler_t handler, + void *user_data); +--- + +Connects to a remote host. + +See `mg_connect_opt()` for full documentation. + diff --git a/docs/c-api/mg_net.h/mg_connect_opt.md b/docs/c-api/mg_net.h/mg_connect_opt.md new file mode 100644 index 000000000..3ae818a44 --- /dev/null +++ b/docs/c-api/mg_net.h/mg_connect_opt.md @@ -0,0 +1,57 @@ +--- +title: "mg_connect_opt()" +decl_name: "mg_connect_opt" +symbol_kind: "func" +signature: | + struct mg_connection *mg_connect_opt(struct mg_mgr *mgr, const char *address, + MG_CB(mg_event_handler_t handler, + void *user_data); +--- + +Connects to a remote host. + +The `address` format is `[PROTO://]HOST:PORT`. `PROTO` could be `tcp` or +`udp`. `HOST` could be an IP address, +IPv6 address (if Mongoose is compiled with `-DMG_ENABLE_IPV6`) or a host +name. If `HOST` is a name, Mongoose will resolve it asynchronously. Examples +of valid addresses: `google.com:80`, `udp://1.2.3.4:53`, `10.0.0.1:443`, +`[::1]:80` + +See the `mg_connect_opts` structure for a description of the optional +parameters. + +Returns a new outbound connection or `NULL` on error. + +NOTE: The connection remains owned by the manager, do not free(). + +NOTE: To enable IPv6 addresses `-DMG_ENABLE_IPV6` should be specified +in the compilation flags. + +NOTE: The new connection will receive `MG_EV_CONNECT` as its first event +which will report the connect success status. +If the asynchronous resolution fails or the `connect()` syscall fails for +whatever reason (e.g. with `ECONNREFUSED` or `ENETUNREACH`), then +`MG_EV_CONNECT` event will report failure. Code example below: + +```c +static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { + int connect_status; + + switch (ev) { + case MG_EV_CONNECT: + connect_status = * (int *) ev_data; + if (connect_status == 0) { + // Success + } else { + // Error + printf("connect() error: %s\n", strerror(connect_status)); + } + break; + ... + } +} + + ... + mg_connect(mgr, "my_site.com:80", ev_handler); +``` + diff --git a/docs/c-api/mg_net.h/mg_event_handler_t.md b/docs/c-api/mg_net.h/mg_event_handler_t.md new file mode 100644 index 000000000..5a4822246 --- /dev/null +++ b/docs/c-api/mg_net.h/mg_event_handler_t.md @@ -0,0 +1,12 @@ +--- +title: "mg_event_handler_t" +decl_name: "mg_event_handler_t" +symbol_kind: "typedef" +signature: | + typedef void (*mg_event_handler_t)(struct mg_connection *nc, int ev, + void *ev_data MG_UD_ARG(void *user_data)); +--- + +Callback function (event handler) prototype. Must be defined by the user. +Mongoose calls the event handler, passing the events defined below. + diff --git a/docs/c-api/mg_net.h/mg_mgr_free.md b/docs/c-api/mg_net.h/mg_mgr_free.md new file mode 100644 index 000000000..d2df34e4c --- /dev/null +++ b/docs/c-api/mg_net.h/mg_mgr_free.md @@ -0,0 +1,12 @@ +--- +title: "mg_mgr_free()" +decl_name: "mg_mgr_free" +symbol_kind: "func" +signature: | + void mg_mgr_free(struct mg_mgr *); +--- + +De-initialises Mongoose manager. + +Closes and deallocates all active connections. + diff --git a/docs/c-api/mg_net.h/mg_mgr_init.md b/docs/c-api/mg_net.h/mg_mgr_init.md new file mode 100644 index 000000000..1e44bf502 --- /dev/null +++ b/docs/c-api/mg_net.h/mg_mgr_init.md @@ -0,0 +1,15 @@ +--- +title: "mg_mgr_init()" +decl_name: "mg_mgr_init" +symbol_kind: "func" +signature: | + void mg_mgr_init(struct mg_mgr *mgr, void *user_data); +--- + +Initialise Mongoose manager. Side effect: ignores SIGPIPE signal. +`mgr->user_data` field will be initialised with a `user_data` parameter. +That is an arbitrary pointer, where the user code can associate some data +with the particular Mongoose manager. For example, a C++ wrapper class +could be written in which case `user_data` can hold a pointer to the +class instance. + diff --git a/docs/c-api/mg_net.h/mg_mgr_init_opt.md b/docs/c-api/mg_net.h/mg_mgr_init_opt.md new file mode 100644 index 000000000..767fed2c2 --- /dev/null +++ b/docs/c-api/mg_net.h/mg_mgr_init_opt.md @@ -0,0 +1,14 @@ +--- +title: "mg_mgr_init_opt()" +decl_name: "mg_mgr_init_opt" +symbol_kind: "func" +signature: | + void mg_mgr_init_opt(struct mg_mgr *mgr, void *user_data, + struct mg_mgr_init_opts opts); +--- + +Like `mg_mgr_init` but with more options. + +Notably, this allows you to create a manger and choose +dynamically which networking interface implementation to use. + diff --git a/docs/c-api/mg_net.h/mg_mgr_poll.md b/docs/c-api/mg_net.h/mg_mgr_poll.md new file mode 100644 index 000000000..b70c31b6d --- /dev/null +++ b/docs/c-api/mg_net.h/mg_mgr_poll.md @@ -0,0 +1,15 @@ +--- +title: "mg_mgr_poll()" +decl_name: "mg_mgr_poll" +symbol_kind: "func" +signature: | + time_t mg_mgr_poll(struct mg_mgr *, int milli); +--- + +This function performs the actual IO and must be called in a loop +(an event loop). It returns the current timestamp. +`milli` is the maximum number of milliseconds to sleep. +`mg_mgr_poll()` checks all connections for IO readiness. If at least one +of the connections is IO-ready, `mg_mgr_poll()` triggers the respective +event handlers and returns. + diff --git a/docs/c-api/mg_net.h/mg_next.md b/docs/c-api/mg_net.h/mg_next.md new file mode 100644 index 000000000..423af6fdb --- /dev/null +++ b/docs/c-api/mg_net.h/mg_next.md @@ -0,0 +1,20 @@ +--- +title: "mg_next()" +decl_name: "mg_next" +symbol_kind: "func" +signature: | + struct mg_connection *mg_next(struct mg_mgr *mgr, struct mg_connection *c); +--- + +Iterates over all active connections. + +Returns the next connection from the list +of active connections or `NULL` if there are no more connections. Below +is the iteration idiom: + +```c +for (c = mg_next(srv, NULL); c != NULL; c = mg_next(srv, c)) { + // Do something with connection `c` +} +``` + diff --git a/docs/c-api/mg_net.h/mg_printf.md b/docs/c-api/mg_net.h/mg_printf.md new file mode 100644 index 000000000..2448235f7 --- /dev/null +++ b/docs/c-api/mg_net.h/mg_printf.md @@ -0,0 +1,12 @@ +--- +title: "mg_printf()" +decl_name: "mg_printf" +symbol_kind: "func" +signature: | + int mg_printf(struct mg_connection *, const char *fmt, ...); +--- + +Sends `printf`-style formatted data to the connection. + +See `mg_send` for more details on send semantics. + diff --git a/docs/c-api/mg_net.h/mg_resolve.md b/docs/c-api/mg_net.h/mg_resolve.md new file mode 100644 index 000000000..9861e182b --- /dev/null +++ b/docs/c-api/mg_net.h/mg_resolve.md @@ -0,0 +1,17 @@ +--- +title: "mg_resolve()" +decl_name: "mg_resolve" +symbol_kind: "func" +signature: | + int mg_resolve(const char *domain_name, char *ip_addr_buf, size_t buf_len); +--- + +Convert domain name into IP address. + +This is a utility function. If compilation flags have +`-DMG_ENABLE_GETADDRINFO`, then `getaddrinfo()` call is used for name +resolution. Otherwise, `gethostbyname()` is used. + +CAUTION: this function can block. +Return 1 on success, 0 on failure. + diff --git a/docs/c-api/mg_net.h/mg_send.md b/docs/c-api/mg_net.h/mg_send.md new file mode 100644 index 000000000..c6963a0d6 --- /dev/null +++ b/docs/c-api/mg_net.h/mg_send.md @@ -0,0 +1,14 @@ +--- +title: "mg_send()" +decl_name: "mg_send" +symbol_kind: "func" +signature: | + void mg_send(struct mg_connection *, const void *buf, int len); +--- + +Sends data to the connection. + +Note that sending functions do not actually push data to the socket. +They just append data to the output buffer. MG_EV_SEND will be delivered when +the data has actually been pushed out. + diff --git a/docs/c-api/mg_net.h/mg_set_ssl.md b/docs/c-api/mg_net.h/mg_set_ssl.md new file mode 100644 index 000000000..35d12d399 --- /dev/null +++ b/docs/c-api/mg_net.h/mg_set_ssl.md @@ -0,0 +1,22 @@ +--- +title: "mg_set_ssl()" +decl_name: "mg_set_ssl" +symbol_kind: "func" +signature: | + const char *mg_set_ssl(struct mg_connection *nc, const char *cert, + const char *ca_cert); +--- + +Note: This function is deprecated. Please, use SSL options in +mg_connect_opt. + +Enables SSL for a given connection. +`cert` is a server certificate file name for a listening connection +or a client certificate file name for an outgoing connection. +The certificate files must be in PEM format. The server certificate file +must contain a certificate, concatenated with a private key, optionally +concatenated with DH parameters. +`ca_cert` is a CA certificate or NULL if peer verification is not +required. +Return: NULL on success or error message on error. + diff --git a/docs/c-api/mg_net.h/mg_set_timer.md b/docs/c-api/mg_net.h/mg_set_timer.md new file mode 100644 index 000000000..0b0892065 --- /dev/null +++ b/docs/c-api/mg_net.h/mg_set_timer.md @@ -0,0 +1,31 @@ +--- +title: "mg_set_timer()" +decl_name: "mg_set_timer" +symbol_kind: "func" +signature: | + double mg_set_timer(struct mg_connection *c, double timestamp); +--- + +Schedules an MG_EV_TIMER event to be delivered at `timestamp` time. +`timestamp` is UNIX time (the number of seconds since Epoch). It is +`double` instead of `time_t` to allow for sub-second precision. +Returns the old timer value. + +Example: set the connect timeout to 1.5 seconds: + +``` + c = mg_connect(&mgr, "cesanta.com", ev_handler); + mg_set_timer(c, mg_time() + 1.5); + ... + + void ev_handler(struct mg_connection *c, int ev, void *ev_data) { + switch (ev) { + case MG_EV_CONNECT: + mg_set_timer(c, 0); // Clear connect timer + break; + case MG_EV_TIMER: + log("Connect timeout"); + c->flags |= MG_F_CLOSE_IMMEDIATELY; + break; +``` + diff --git a/docs/c-api/mg_net.h/mg_socketpair.md b/docs/c-api/mg_net.h/mg_socketpair.md new file mode 100644 index 000000000..bd36cbce7 --- /dev/null +++ b/docs/c-api/mg_net.h/mg_socketpair.md @@ -0,0 +1,12 @@ +--- +title: "mg_socketpair()" +decl_name: "mg_socketpair" +symbol_kind: "func" +signature: | + int mg_socketpair(sock_t[2], int sock_type); +--- + +Creates a socket pair. +`sock_type` can be either `SOCK_STREAM` or `SOCK_DGRAM`. +Returns 0 on failure and 1 on success. + diff --git a/docs/c-api/mg_net.h/mg_time.md b/docs/c-api/mg_net.h/mg_time.md new file mode 100644 index 000000000..ec93b8972 --- /dev/null +++ b/docs/c-api/mg_net.h/mg_time.md @@ -0,0 +1,10 @@ +--- +title: "mg_time()" +decl_name: "mg_time" +symbol_kind: "func" +signature: | + double mg_time(void); +--- + +A sub-second precision version of time(). + diff --git a/docs/c-api/mg_net.h/mg_vprintf.md b/docs/c-api/mg_net.h/mg_vprintf.md new file mode 100644 index 000000000..ff66e264f --- /dev/null +++ b/docs/c-api/mg_net.h/mg_vprintf.md @@ -0,0 +1,10 @@ +--- +title: "mg_vprintf()" +decl_name: "mg_vprintf" +symbol_kind: "func" +signature: | + int mg_vprintf(struct mg_connection *, const char *fmt, va_list ap); +--- + +Same as `mg_printf()`, but takes `va_list ap` as an argument. + diff --git a/docs/c-api/mg_net.h/struct_mg_add_sock_opts.md b/docs/c-api/mg_net.h/struct_mg_add_sock_opts.md new file mode 100644 index 000000000..b4b1737bc --- /dev/null +++ b/docs/c-api/mg_net.h/struct_mg_add_sock_opts.md @@ -0,0 +1,18 @@ +--- +title: "struct mg_add_sock_opts" +decl_name: "struct mg_add_sock_opts" +symbol_kind: "struct" +signature: | + struct mg_add_sock_opts { + void *user_data; /* Initial value for connection's user_data */ + unsigned int flags; /* Initial connection flags */ + const char **error_string; /* Placeholder for the error string */ + struct mg_iface *iface; /* Interface instance */ + }; +--- + +Optional parameters to `mg_add_sock_opt()`. + +`flags` is an initial `struct mg_connection::flags` bitmask to set, +see `MG_F_*` flags definitions. + diff --git a/docs/c-api/mg_net.h/struct_mg_bind_opts.md b/docs/c-api/mg_net.h/struct_mg_bind_opts.md new file mode 100644 index 000000000..13217ec79 --- /dev/null +++ b/docs/c-api/mg_net.h/struct_mg_bind_opts.md @@ -0,0 +1,44 @@ +--- +title: "struct mg_bind_opts" +decl_name: "struct mg_bind_opts" +symbol_kind: "struct" +signature: | + struct mg_bind_opts { + void *user_data; /* Initial value for connection's user_data */ + unsigned int flags; /* Extra connection flags */ + const char **error_string; /* Placeholder for the error string */ + struct mg_iface *iface; /* Interface instance */ + #if MG_ENABLE_SSL + /* + * SSL settings. + * + * Server certificate to present to clients or client certificate to + * present to tunnel dispatcher (for tunneled connections). + */ + const char *ssl_cert; + /* Private key corresponding to the certificate. If ssl_cert is set but + * ssl_key is not, ssl_cert is used. */ + const char *ssl_key; + /* CA bundle used to verify client certificates or tunnel dispatchers. */ + const char *ssl_ca_cert; + /* Colon-delimited list of acceptable cipher suites. + * Names depend on the library used, for example: + * + * ECDH-ECDSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256 (OpenSSL) + * TLS-ECDH-ECDSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256 + * (mbedTLS) + * + * For OpenSSL the list can be obtained by running "openssl ciphers". + * For mbedTLS, names can be found in library/ssl_ciphersuites.c + * If NULL, a reasonable default is used. + */ + const char *ssl_cipher_suites; + #endif + }; +--- + +Optional parameters to `mg_bind_opt()`. + +`flags` is an initial `struct mg_connection::flags` bitmask to set, +see `MG_F_*` flags definitions. + diff --git a/docs/c-api/mg_net.h/struct_mg_connect_opts.md b/docs/c-api/mg_net.h/struct_mg_connect_opts.md new file mode 100644 index 000000000..f05bf25f4 --- /dev/null +++ b/docs/c-api/mg_net.h/struct_mg_connect_opts.md @@ -0,0 +1,62 @@ +--- +title: "struct mg_connect_opts" +decl_name: "struct mg_connect_opts" +symbol_kind: "struct" +signature: | + struct mg_connect_opts { + void *user_data; /* Initial value for connection's user_data */ + unsigned int flags; /* Extra connection flags */ + const char **error_string; /* Placeholder for the error string */ + struct mg_iface *iface; /* Interface instance */ + const char *nameserver; /* DNS server to use, NULL for default */ + #if MG_ENABLE_SSL + /* + * SSL settings. + * Client certificate to present to the server. + */ + const char *ssl_cert; + /* + * Private key corresponding to the certificate. + * If ssl_cert is set but ssl_key is not, ssl_cert is used. + */ + const char *ssl_key; + /* + * Verify server certificate using this CA bundle. If set to "*", then SSL + * is enabled but no cert verification is performed. + */ + const char *ssl_ca_cert; + /* Colon-delimited list of acceptable cipher suites. + * Names depend on the library used, for example: + * + * ECDH-ECDSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256 (OpenSSL) + * TLS-ECDH-ECDSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256 + * (mbedTLS) + * + * For OpenSSL the list can be obtained by running "openssl ciphers". + * For mbedTLS, names can be found in library/ssl_ciphersuites.c + * If NULL, a reasonable default is used. + */ + const char *ssl_cipher_suites; + /* + * Server name verification. If ssl_ca_cert is set and the certificate has + * passed verification, its subject will be verified against this string. + * By default (if ssl_server_name is NULL) hostname part of the address will + * be used. Wildcard matching is supported. A special value of "*" disables + * name verification. + */ + const char *ssl_server_name; + /* + * PSK identity and key. Identity is a NUL-terminated string and key is a hex + * string. Key must be either 16 or 32 bytes (32 or 64 hex digits) for AES-128 + * or AES-256 respectively. + * Note: Default list of cipher suites does not include PSK suites, if you + * want to use PSK you will need to set ssl_cipher_suites as well. + */ + const char *ssl_psk_identity; + const char *ssl_psk_key; + #endif + }; +--- + +Optional parameters to `mg_connect_opt()` + diff --git a/docs/c-api/mg_net.h/struct_mg_connection.md b/docs/c-api/mg_net.h/struct_mg_connection.md new file mode 100644 index 000000000..be69d16fd --- /dev/null +++ b/docs/c-api/mg_net.h/struct_mg_connection.md @@ -0,0 +1,67 @@ +--- +title: "struct mg_connection" +decl_name: "struct mg_connection" +symbol_kind: "struct" +signature: | + struct mg_connection { + struct mg_connection *next, *prev; /* mg_mgr::active_connections linkage */ + struct mg_connection *listener; /* Set only for accept()-ed connections */ + struct mg_mgr *mgr; /* Pointer to containing manager */ + + sock_t sock; /* Socket to the remote peer */ + int err; + union socket_address sa; /* Remote peer address */ + size_t recv_mbuf_limit; /* Max size of recv buffer */ + struct mbuf recv_mbuf; /* Received data */ + struct mbuf send_mbuf; /* Data scheduled for sending */ + time_t last_io_time; /* Timestamp of the last socket IO */ + double ev_timer_time; /* Timestamp of the future MG_EV_TIMER */ + #if MG_ENABLE_SSL + void *ssl_if_data; /* SSL library data. */ + #endif + mg_event_handler_t proto_handler; /* Protocol-specific event handler */ + void *proto_data; /* Protocol-specific data */ + void (*proto_data_destructor)(void *proto_data); + mg_event_handler_t handler; /* Event handler function */ + void *user_data; /* User-specific data */ + union { + void *v; + /* + * the C standard is fussy about fitting function pointers into + * void pointers, since some archs might have fat pointers for functions. + */ + mg_event_handler_t f; + } priv_1; + void *priv_2; + void *mgr_data; /* Implementation-specific event manager's data. */ + struct mg_iface *iface; + unsigned long flags; + /* Flags set by Mongoose */ + #define MG_F_LISTENING (1 << 0) /* This connection is listening */ + #define MG_F_UDP (1 << 1) /* This connection is UDP */ + #define MG_F_RESOLVING (1 << 2) /* Waiting for async resolver */ + #define MG_F_CONNECTING (1 << 3) /* connect() call in progress */ + #define MG_F_SSL (1 << 4) /* SSL is enabled on the connection */ + #define MG_F_SSL_HANDSHAKE_DONE (1 << 5) /* SSL hanshake has completed */ + #define MG_F_WANT_READ (1 << 6) /* SSL specific */ + #define MG_F_WANT_WRITE (1 << 7) /* SSL specific */ + #define MG_F_IS_WEBSOCKET (1 << 8) /* Websocket specific */ + + /* Flags that are settable by user */ + #define MG_F_SEND_AND_CLOSE (1 << 10) /* Push remaining data and close */ + #define MG_F_CLOSE_IMMEDIATELY (1 << 11) /* Disconnect */ + #define MG_F_WEBSOCKET_NO_DEFRAG (1 << 12) /* Websocket specific */ + #define MG_F_DELETE_CHUNK (1 << 13) /* HTTP specific */ + #define MG_F_ENABLE_BROADCAST (1 << 14) /* Allow broadcast address usage */ + + #define MG_F_USER_1 (1 << 20) /* Flags left for application */ + #define MG_F_USER_2 (1 << 21) + #define MG_F_USER_3 (1 << 22) + #define MG_F_USER_4 (1 << 23) + #define MG_F_USER_5 (1 << 24) + #define MG_F_USER_6 (1 << 25) + }; +--- + +Mongoose connection. + diff --git a/docs/c-api/mg_net.h/struct_mg_mgr.md b/docs/c-api/mg_net.h/struct_mg_mgr.md new file mode 100644 index 000000000..d33727c38 --- /dev/null +++ b/docs/c-api/mg_net.h/struct_mg_mgr.md @@ -0,0 +1,22 @@ +--- +title: "struct mg_mgr" +decl_name: "struct mg_mgr" +symbol_kind: "struct" +signature: | + struct mg_mgr { + struct mg_connection *active_connections; + #if MG_ENABLE_HEXDUMP + const char *hexdump_file; /* Debug hexdump file path */ + #endif + #if MG_ENABLE_BROADCAST + sock_t ctl[2]; /* Socketpair for mg_broadcast() */ + #endif + void *user_data; /* User data */ + int num_ifaces; + struct mg_iface **ifaces; /* network interfaces */ + const char *nameserver; /* DNS server to use */ + }; +--- + +Mongoose event manager. + diff --git a/docs/c-api/mg_net.h/struct_mg_mgr_init_opts.md b/docs/c-api/mg_net.h/struct_mg_mgr_init_opts.md new file mode 100644 index 000000000..7db23de5b --- /dev/null +++ b/docs/c-api/mg_net.h/struct_mg_mgr_init_opts.md @@ -0,0 +1,27 @@ +--- +title: "struct mg_mgr_init_opts" +decl_name: "struct mg_mgr_init_opts" +symbol_kind: "struct" +signature: | + struct mg_mgr_init_opts { + const struct mg_iface_vtable *main_iface; + int num_ifaces; + const struct mg_iface_vtable **ifaces; + const char *nameserver; + }; +--- + +Optional parameters to `mg_mgr_init_opt()`. + +If `main_iface` is not NULL, it will be used as the main interface in the +default interface set. The pointer will be free'd by `mg_mgr_free`. +Otherwise, the main interface will be autodetected based on the current +platform. + +If `num_ifaces` is 0 and `ifaces` is NULL, the default interface set will be +used. +This is an advanced option, as it requires you to construct a full interface +set, including special networking interfaces required by some optional +features such as TCP tunneling. Memory backing `ifaces` and each of the +`num_ifaces` pointers it contains will be reclaimed by `mg_mgr_free`. + diff --git a/docs/c-api/mg_resolv.h/intro.md b/docs/c-api/mg_resolv.h/intro.md new file mode 100644 index 000000000..7de6337cc --- /dev/null +++ b/docs/c-api/mg_resolv.h/intro.md @@ -0,0 +1,14 @@ +--- +title: "API reference" +symbol_kind: "intro" +decl_name: "mg_resolv.h" +items: + - { name: mg_resolve_async.md } + - { name: mg_resolve_async_opt.md } + - { name: mg_resolve_from_hosts_file.md } + - { name: mg_set_nameserver.md } + - { name: struct_mg_resolve_async_opts.md } +--- + + + diff --git a/docs/c-api/mg_resolv.h/mg_resolve_async.md b/docs/c-api/mg_resolv.h/mg_resolve_async.md new file mode 100644 index 000000000..e4dc5d5d0 --- /dev/null +++ b/docs/c-api/mg_resolv.h/mg_resolve_async.md @@ -0,0 +1,11 @@ +--- +title: "mg_resolve_async()" +decl_name: "mg_resolve_async" +symbol_kind: "func" +signature: | + int mg_resolve_async(struct mg_mgr *mgr, const char *name, int query, + mg_resolve_callback_t cb, void *data); +--- + +See `mg_resolve_async_opt()` + diff --git a/docs/c-api/mg_resolv.h/mg_resolve_async_opt.md b/docs/c-api/mg_resolv.h/mg_resolve_async_opt.md new file mode 100644 index 000000000..56f209a74 --- /dev/null +++ b/docs/c-api/mg_resolv.h/mg_resolve_async_opt.md @@ -0,0 +1,30 @@ +--- +title: "mg_resolve_async_opt()" +decl_name: "mg_resolve_async_opt" +symbol_kind: "func" +signature: | + int mg_resolve_async_opt(struct mg_mgr *mgr, const char *name, int query, + mg_resolve_callback_t cb, void *data, + struct mg_resolve_async_opts opts); +--- + +Resolved a DNS name asynchronously. + +Upon successful resolution, the user callback will be invoked +with the full DNS response message and a pointer to the user's +context `data`. + +In case of timeout while performing the resolution the callback +will receive a NULL `msg`. + +The DNS answers can be extracted with `mg_next_record` and +`mg_dns_parse_record_data`: + +[source,c] +---- +struct in_addr ina; +struct mg_dns_resource_record *rr = mg_next_record(msg, MG_DNS_A_RECORD, + NULL); +mg_dns_parse_record_data(msg, rr, &ina, sizeof(ina)); +---- + diff --git a/docs/c-api/mg_resolv.h/mg_resolve_from_hosts_file.md b/docs/c-api/mg_resolv.h/mg_resolve_from_hosts_file.md new file mode 100644 index 000000000..42aa1e67c --- /dev/null +++ b/docs/c-api/mg_resolv.h/mg_resolve_from_hosts_file.md @@ -0,0 +1,12 @@ +--- +title: "mg_resolve_from_hosts_file()" +decl_name: "mg_resolve_from_hosts_file" +symbol_kind: "func" +signature: | + int mg_resolve_from_hosts_file(const char *host, union socket_address *usa); +--- + +Resolve a name from `/etc/hosts`. + +Returns 0 on success, -1 on failure. + diff --git a/docs/c-api/mg_resolv.h/mg_set_nameserver.md b/docs/c-api/mg_resolv.h/mg_set_nameserver.md new file mode 100644 index 000000000..2e33c629c --- /dev/null +++ b/docs/c-api/mg_resolv.h/mg_set_nameserver.md @@ -0,0 +1,10 @@ +--- +title: "mg_set_nameserver()" +decl_name: "mg_set_nameserver" +symbol_kind: "func" +signature: | + void mg_set_nameserver(struct mg_mgr *mgr, const char *nameserver); +--- + +Set default DNS server + diff --git a/docs/c-api/mg_resolv.h/struct_mg_resolve_async_opts.md b/docs/c-api/mg_resolv.h/struct_mg_resolve_async_opts.md new file mode 100644 index 000000000..8a836b9a0 --- /dev/null +++ b/docs/c-api/mg_resolv.h/struct_mg_resolve_async_opts.md @@ -0,0 +1,17 @@ +--- +title: "struct mg_resolve_async_opts" +decl_name: "struct mg_resolve_async_opts" +symbol_kind: "struct" +signature: | + struct mg_resolve_async_opts { + const char *nameserver; + int max_retries; /* defaults to 2 if zero */ + int timeout; /* in seconds; defaults to 5 if zero */ + int accept_literal; /* pseudo-resolve literal ipv4 and ipv6 addrs */ + int only_literal; /* only resolves literal addrs; sync cb invocation */ + struct mg_connection **dns_conn; /* return DNS connection */ + }; +--- + +Options for `mg_resolve_async_opt`. + diff --git a/docs/c-api/mg_uri.h/intro.md b/docs/c-api/mg_uri.h/intro.md new file mode 100644 index 000000000..504870182 --- /dev/null +++ b/docs/c-api/mg_uri.h/intro.md @@ -0,0 +1,11 @@ +--- +title: "URI" +symbol_kind: "intro" +decl_name: "mg_uri.h" +items: + - { name: mg_assemble_uri.md } + - { name: mg_parse_uri.md } +--- + + + diff --git a/docs/c-api/mg_uri.h/mg_assemble_uri.md b/docs/c-api/mg_uri.h/mg_assemble_uri.md new file mode 100644 index 000000000..200651483 --- /dev/null +++ b/docs/c-api/mg_uri.h/mg_assemble_uri.md @@ -0,0 +1,20 @@ +--- +title: "mg_assemble_uri()" +decl_name: "mg_assemble_uri" +symbol_kind: "func" +signature: | + int mg_assemble_uri(const struct mg_str *scheme, const struct mg_str *user_info, + const struct mg_str *host, unsigned int port, + const struct mg_str *path, const struct mg_str *query, + const struct mg_str *fragment, int normalize_path, + struct mg_str *uri); +--- + +Assemble URI from parts. Any of the inputs can be NULL or zero-length mg_str. + +If normalize_path is true, path is normalized by resolving relative refs. + +Result is a heap-allocated string (uri->p must be free()d after use). + +Returns 0 on success, -1 on error. + diff --git a/docs/c-api/mg_uri.h/mg_parse_uri.md b/docs/c-api/mg_uri.h/mg_parse_uri.md new file mode 100644 index 000000000..2d330f18e --- /dev/null +++ b/docs/c-api/mg_uri.h/mg_parse_uri.md @@ -0,0 +1,33 @@ +--- +title: "mg_parse_uri()" +decl_name: "mg_parse_uri" +symbol_kind: "func" +signature: | + int mg_parse_uri(const struct mg_str uri, struct mg_str *scheme, + struct mg_str *user_info, struct mg_str *host, + unsigned int *port, struct mg_str *path, struct mg_str *query, + struct mg_str *fragment); +--- + +Parses an URI and fills string chunks with locations of the respective +uri components within the input uri string. NULL pointers will be +ignored. + +General syntax: + + [scheme://[user_info@]]host[:port][/path][?query][#fragment] + +Example: + + foo.com:80 + tcp://foo.com:1234 + http://foo.com:80/bar?baz=1 + https://user:pw@foo.com:443/blah + +`path` will include the leading slash. `query` won't include the leading `?`. +`host` can contain embedded colons if surrounded by square brackets in order +to support IPv6 literal addresses. + + +Returns 0 on success, -1 on error. + diff --git a/docs/c-api/mg_util.h/intro.md b/docs/c-api/mg_util.h/intro.md new file mode 100644 index 000000000..0a0bfe3df --- /dev/null +++ b/docs/c-api/mg_util.h/intro.md @@ -0,0 +1,29 @@ +--- +title: "Utility API" +symbol_kind: "intro" +decl_name: "mg_util.h" +items: + - { name: mg_base64_decode.md } + - { name: mg_base64_encode.md } + - { name: mg_basic_auth_header.md } + - { name: mg_conn_addr_to_str.md } + - { name: mg_fopen.md } + - { name: mg_fread.md } + - { name: mg_fwrite.md } + - { name: mg_hexdump.md } + - { name: mg_hexdump_connection.md } + - { name: mg_hexdumpf.md } + - { name: mg_is_big_endian.md } + - { name: mg_mbuf_append_base64.md } + - { name: mg_mbuf_append_base64_putc.md } + - { name: mg_open.md } + - { name: mg_skip.md } + - { name: mg_sock_addr_to_str.md } + - { name: mg_sock_to_str.md } + - { name: mg_start_thread.md } + - { name: mg_stat.md } + - { name: mg_url_encode.md } +--- + + + diff --git a/docs/c-api/mg_util.h/mg_base64_decode.md b/docs/c-api/mg_util.h/mg_base64_decode.md new file mode 100644 index 000000000..92f7c10bf --- /dev/null +++ b/docs/c-api/mg_util.h/mg_base64_decode.md @@ -0,0 +1,17 @@ +--- +title: "mg_base64_decode()" +decl_name: "mg_base64_decode" +symbol_kind: "func" +signature: | + int mg_base64_decode(const unsigned char *s, int len, char *dst); +--- + +Decodes base64-encoded string `s`, `len` into the destination `dst`. +The destination has to have enough space to hold the decoded buffer. +Decoding stops either when all strings have been decoded or invalid an +character appeared. +Destination is '\0'-terminated. +Returns the number of decoded characters. On success, that should be equal +to `len`. On error (invalid character) the return value is smaller then +`len`. + diff --git a/docs/c-api/mg_util.h/mg_base64_encode.md b/docs/c-api/mg_util.h/mg_base64_encode.md new file mode 100644 index 000000000..c3b5c05e2 --- /dev/null +++ b/docs/c-api/mg_util.h/mg_base64_encode.md @@ -0,0 +1,12 @@ +--- +title: "mg_base64_encode()" +decl_name: "mg_base64_encode" +symbol_kind: "func" +signature: | + void mg_base64_encode(const unsigned char *src, int src_len, char *dst); +--- + +Base64-encode chunk of memory `src`, `src_len` into the destination `dst`. +Destination has to have enough space to hold encoded buffer. +Destination is '\0'-terminated. + diff --git a/docs/c-api/mg_util.h/mg_basic_auth_header.md b/docs/c-api/mg_util.h/mg_basic_auth_header.md new file mode 100644 index 000000000..724ec0539 --- /dev/null +++ b/docs/c-api/mg_util.h/mg_basic_auth_header.md @@ -0,0 +1,13 @@ +--- +title: "mg_basic_auth_header()" +decl_name: "mg_basic_auth_header" +symbol_kind: "func" +signature: | + void mg_basic_auth_header(const struct mg_str user, const struct mg_str pass, + struct mbuf *buf); +--- + +Generate a Basic Auth header and appends it to buf. +If pass is NULL, then user is expected to contain the credentials pair +already encoded as `user:pass`. + diff --git a/docs/c-api/mg_util.h/mg_conn_addr_to_str.md b/docs/c-api/mg_util.h/mg_conn_addr_to_str.md new file mode 100644 index 000000000..b7603fb29 --- /dev/null +++ b/docs/c-api/mg_util.h/mg_conn_addr_to_str.md @@ -0,0 +1,22 @@ +--- +title: "mg_conn_addr_to_str()" +decl_name: "mg_conn_addr_to_str" +symbol_kind: "func" +signature: | + int mg_conn_addr_to_str(struct mg_connection *c, char *buf, size_t len, + int flags); +--- + +Converts a connection's local or remote address into string. + +The `flags` parameter is a bit mask that controls the behaviour, +see `MG_SOCK_STRINGIFY_*` definitions. + +- MG_SOCK_STRINGIFY_IP - print IP address +- MG_SOCK_STRINGIFY_PORT - print port number +- MG_SOCK_STRINGIFY_REMOTE - print remote peer's IP/port, not local address + +If both port number and IP address are printed, they are separated by `:`. +If compiled with `-DMG_ENABLE_IPV6`, IPv6 addresses are supported. +Return length of the stringified address. + diff --git a/docs/c-api/mg_util.h/mg_fopen.md b/docs/c-api/mg_util.h/mg_fopen.md new file mode 100644 index 000000000..3cb8568a0 --- /dev/null +++ b/docs/c-api/mg_util.h/mg_fopen.md @@ -0,0 +1,14 @@ +--- +title: "mg_fopen()" +decl_name: "mg_fopen" +symbol_kind: "func" +signature: | + FILE *mg_fopen(const char *path, const char *mode); +--- + +Opens the given file and returns a file stream. + +`path` and `mode` should be UTF8 encoded. + +Return value is the same as for the `fopen()` call. + diff --git a/docs/c-api/mg_util.h/mg_fread.md b/docs/c-api/mg_util.h/mg_fread.md new file mode 100644 index 000000000..0ff4994ad --- /dev/null +++ b/docs/c-api/mg_util.h/mg_fread.md @@ -0,0 +1,12 @@ +--- +title: "mg_fread()" +decl_name: "mg_fread" +symbol_kind: "func" +signature: | + size_t mg_fread(void *ptr, size_t size, size_t count, FILE *f); +--- + +Reads data from the given file stream. + +Return value is a number of bytes readen. + diff --git a/docs/c-api/mg_util.h/mg_fwrite.md b/docs/c-api/mg_util.h/mg_fwrite.md new file mode 100644 index 000000000..5ddbbbcea --- /dev/null +++ b/docs/c-api/mg_util.h/mg_fwrite.md @@ -0,0 +1,12 @@ +--- +title: "mg_fwrite()" +decl_name: "mg_fwrite" +symbol_kind: "func" +signature: | + size_t mg_fwrite(const void *ptr, size_t size, size_t count, FILE *f); +--- + +Writes data to the given file stream. + +Return value is a number of bytes wtitten. + diff --git a/docs/c-api/mg_util.h/mg_hexdump.md b/docs/c-api/mg_util.h/mg_hexdump.md new file mode 100644 index 000000000..c8376bf62 --- /dev/null +++ b/docs/c-api/mg_util.h/mg_hexdump.md @@ -0,0 +1,15 @@ +--- +title: "mg_hexdump()" +decl_name: "mg_hexdump" +symbol_kind: "func" +signature: | + int mg_hexdump(const void *buf, int len, char *dst, int dst_len); +--- + +Generates a human-readable hexdump of memory chunk. + +Takes a memory buffer `buf` of length `len` and creates a hex dump of that +buffer in `dst`. The generated output is a-la hexdump(1). +Returns the length of generated string, excluding terminating `\0`. If +returned length is bigger than `dst_len`, the overflow bytes are discarded. + diff --git a/docs/c-api/mg_util.h/mg_hexdump_connection.md b/docs/c-api/mg_util.h/mg_hexdump_connection.md new file mode 100644 index 000000000..03d8a6b2d --- /dev/null +++ b/docs/c-api/mg_util.h/mg_hexdump_connection.md @@ -0,0 +1,15 @@ +--- +title: "mg_hexdump_connection()" +decl_name: "mg_hexdump_connection" +symbol_kind: "func" +signature: | + void mg_hexdump_connection(struct mg_connection *nc, const char *path, + const void *buf, int num_bytes, int ev); +--- + +Generates human-readable hexdump of the data sent or received by the +connection. `path` is a file name where hexdump should be written. +`num_bytes` is a number of bytes sent/received. `ev` is one of the `MG_*` +events sent to an event handler. This function is supposed to be called from +the event handler. + diff --git a/docs/c-api/mg_util.h/mg_hexdumpf.md b/docs/c-api/mg_util.h/mg_hexdumpf.md new file mode 100644 index 000000000..dcb14ece7 --- /dev/null +++ b/docs/c-api/mg_util.h/mg_hexdumpf.md @@ -0,0 +1,10 @@ +--- +title: "mg_hexdumpf()" +decl_name: "mg_hexdumpf" +symbol_kind: "func" +signature: | + void mg_hexdumpf(FILE *fp, const void *buf, int len); +--- + +Same as mg_hexdump, but with output going to file instead of a buffer. + diff --git a/docs/c-api/mg_util.h/mg_is_big_endian.md b/docs/c-api/mg_util.h/mg_is_big_endian.md new file mode 100644 index 000000000..4cd54da7e --- /dev/null +++ b/docs/c-api/mg_util.h/mg_is_big_endian.md @@ -0,0 +1,10 @@ +--- +title: "mg_is_big_endian()" +decl_name: "mg_is_big_endian" +symbol_kind: "func" +signature: | + int mg_is_big_endian(void); +--- + +Returns true if target platform is big endian. + diff --git a/docs/c-api/mg_util.h/mg_mbuf_append_base64.md b/docs/c-api/mg_util.h/mg_mbuf_append_base64.md new file mode 100644 index 000000000..d0617fcf2 --- /dev/null +++ b/docs/c-api/mg_util.h/mg_mbuf_append_base64.md @@ -0,0 +1,10 @@ +--- +title: "mg_mbuf_append_base64()" +decl_name: "mg_mbuf_append_base64" +symbol_kind: "func" +signature: | + void mg_mbuf_append_base64(struct mbuf *mbuf, const void *data, size_t len); +--- + +Encode `len` bytes starting at `data` as base64 and append them to an mbuf. + diff --git a/docs/c-api/mg_util.h/mg_mbuf_append_base64_putc.md b/docs/c-api/mg_util.h/mg_mbuf_append_base64_putc.md new file mode 100644 index 000000000..a4d2b4285 --- /dev/null +++ b/docs/c-api/mg_util.h/mg_mbuf_append_base64_putc.md @@ -0,0 +1,10 @@ +--- +title: "mg_mbuf_append_base64_putc()" +decl_name: "mg_mbuf_append_base64_putc" +symbol_kind: "func" +signature: | + void mg_mbuf_append_base64_putc(char ch, void *user_data); +--- + +Use with cs_base64_init/update/finish in order to write out base64 in chunks. + diff --git a/docs/c-api/mg_util.h/mg_open.md b/docs/c-api/mg_util.h/mg_open.md new file mode 100644 index 000000000..aaa8e56ea --- /dev/null +++ b/docs/c-api/mg_util.h/mg_open.md @@ -0,0 +1,14 @@ +--- +title: "mg_open()" +decl_name: "mg_open" +symbol_kind: "func" +signature: | + int mg_open(const char *path, int flag, int mode); +--- + +Opens the given file and returns a file stream. + +`path` should be UTF8 encoded. + +Return value is the same as for the `open()` syscall. + diff --git a/docs/c-api/mg_util.h/mg_skip.md b/docs/c-api/mg_util.h/mg_skip.md new file mode 100644 index 000000000..cc7b2fd14 --- /dev/null +++ b/docs/c-api/mg_util.h/mg_skip.md @@ -0,0 +1,17 @@ +--- +title: "mg_skip()" +decl_name: "mg_skip" +symbol_kind: "func" +signature: | + const char *mg_skip(const char *s, const char *end_string, + const char *delimiters, struct mg_str *v); +--- + +Fetches substring from input string `s`, `end` into `v`. +Skips initial delimiter characters. Records first non-delimiter character +at the beginning of substring `v`. Then scans the rest of the string +until a delimiter character or end-of-string is found. +`delimiters` is a 0-terminated string containing delimiter characters. +Either one of `delimiters` or `end_string` terminates the search. +Returns an `s` pointer, advanced forward where parsing has stopped. + diff --git a/docs/c-api/mg_util.h/mg_sock_addr_to_str.md b/docs/c-api/mg_util.h/mg_sock_addr_to_str.md new file mode 100644 index 000000000..b5cb6fddd --- /dev/null +++ b/docs/c-api/mg_util.h/mg_sock_addr_to_str.md @@ -0,0 +1,13 @@ +--- +title: "mg_sock_addr_to_str()" +decl_name: "mg_sock_addr_to_str" +symbol_kind: "func" +signature: | + int mg_sock_addr_to_str(const union socket_address *sa, char *buf, size_t len, + int flags); +--- + +Convert the socket's address into string. + +`flags` is MG_SOCK_STRINGIFY_IP and/or MG_SOCK_STRINGIFY_PORT. + diff --git a/docs/c-api/mg_util.h/mg_sock_to_str.md b/docs/c-api/mg_util.h/mg_sock_to_str.md new file mode 100644 index 000000000..fb233b560 --- /dev/null +++ b/docs/c-api/mg_util.h/mg_sock_to_str.md @@ -0,0 +1,10 @@ +--- +title: "mg_sock_to_str()" +decl_name: "mg_sock_to_str" +symbol_kind: "func" +signature: | + void mg_sock_to_str(sock_t sock, char *buf, size_t len, int flags); +--- + +Legacy interface. + diff --git a/docs/c-api/mg_util.h/mg_start_thread.md b/docs/c-api/mg_util.h/mg_start_thread.md new file mode 100644 index 000000000..4a3c809f9 --- /dev/null +++ b/docs/c-api/mg_util.h/mg_start_thread.md @@ -0,0 +1,13 @@ +--- +title: "mg_start_thread()" +decl_name: "mg_start_thread" +symbol_kind: "func" +signature: | + void *mg_start_thread(void *(*thread_func); +--- + +Starts a new detached thread. +Arguments and semantics are the same as pthead's `pthread_create()`. +`thread_func` is a thread function, `thread_func_param` is a parameter +that is passed to the thread function. + diff --git a/docs/c-api/mg_util.h/mg_stat.md b/docs/c-api/mg_util.h/mg_stat.md new file mode 100644 index 000000000..5bd3b0eb4 --- /dev/null +++ b/docs/c-api/mg_util.h/mg_stat.md @@ -0,0 +1,14 @@ +--- +title: "mg_stat()" +decl_name: "mg_stat" +symbol_kind: "func" +signature: | + int mg_stat(const char *path, cs_stat_t *st); +--- + +Performs a 64-bit `stat()` call against a given file. + +`path` should be UTF8 encoded. + +Return value is the same as for `stat()` syscall. + diff --git a/docs/c-api/mg_util.h/mg_url_encode.md b/docs/c-api/mg_util.h/mg_url_encode.md new file mode 100644 index 000000000..105ce9473 --- /dev/null +++ b/docs/c-api/mg_util.h/mg_url_encode.md @@ -0,0 +1,13 @@ +--- +title: "mg_url_encode()" +decl_name: "mg_url_encode" +symbol_kind: "func" +signature: | + struct mg_str mg_url_encode(const struct mg_str src); +--- + +URL-escape the specified string. +All non-printable characters are escaped, plus `._-$,;~()/`. +Input need not be NUL-terminated, but the returned string is. +Returned string is heap-allocated and must be free()'d. + -- GitLab