summaryrefslogtreecommitdiff
path: root/src/core/curl_helpers.h
blob: e1f4205007cd3c12bd91de9407cf5056ef501597 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/* BSD-2-Clause license
 * 
 * Copyright (c) 2018-2023 NST <www.newinfosec.ru>, sss <sss at dark-alexandr dot net>. 
 * 
 */


#pragma once

void *init_curl_global();

void per_thread_curl_init(void *user_pool_data, wrdp_thpool_thread *t);

bool curl_contact_auth_server(const char *token, void *user_data);

typedef enum curl_request_type_
{
	curl_request_type_get,
	curl_request_type_post
} curl_request_type;

typedef struct _request_info
{
	/* CURLM */
	void *cm;

	/* type of HTTP request */
	curl_request_type type;
	ws_session *session;

	/* buffer to be written (GET) / to be sent (POST) */
	uint8_t *data;

	/* capacity of data */
	size_t data_size;

	/* size of handled data */
	size_t written;

	/* URL to use in the request; must be URL-encoded in the following
	 * format: scheme://host:port/path */
	char *url;

	/* handler callback
	 * may be NULL
	 * return false on failure */
	bool (*user_data_handler_cb)(
	    uint8_t *buf, ws_session *session, void *userdata);

	/* callback to clean up userdata */
	void (*free_cb)(void *userdata);

	/* user specified data passed to all callbacks */
	void *userdata;
} curl_request_info;

curl_request_info *curl_init_request(ws_session *session,
    curl_request_type type, uint8_t *data, size_t data_size,
    bool (*user_data_handler_cb)(
	uint8_t *buf, ws_session *session, void *userdata),
    void (*free_cb)(void *userdata), void *userdata);

bool curl_request(curl_request_info *r);

char *get_url(const char *s, curl_request_type type);

void curl_list_session_destroy(ws_session *session);

struct curls_easy_s
{
	ws_session *session;
	void *curl;
	SLIST_ENTRY(curls_easy_s) entries;
};

size_t curl_prepare_post_request_data(uint8_t **buf, ws_session *session);