17#ifndef GLOBUS_DONT_DOCUMENT_INTERNAL
22#ifndef GLOBUS_I_DSI_REST_H
23#define GLOBUS_I_DSI_REST_H
29#include "globus_i_gridftp_server_config.h"
33#include "globus_common.h"
40struct globus_i_dsi_rest_read_json_arg_s
47globus_i_dsi_rest_read_json_arg_t;
50globus_i_dsi_rest_buffer_s
54 uint64_t transfer_offset;
55 struct globus_i_dsi_rest_buffer_s *next;
56 unsigned char buffer[];
58globus_i_dsi_rest_buffer_t;
61globus_i_dsi_rest_idle_arg_s
63 globus_abstime_t last_activity;
64 uintptr_t idle_timeout;
65 uint64_t last_amt_read;
66 uint64_t last_amt_written;
68globus_i_dsi_rest_idle_arg_t;
71struct globus_i_dsi_rest_gridftp_op_arg_s
73 globus_gfs_operation_t op;
76 globus_result_t result;
86 globus_i_dsi_rest_buffer_t *pending_buffers;
87 globus_i_dsi_rest_buffer_t **pending_buffers_last;
89 globus_i_dsi_rest_buffer_t *current_buffer;
91 globus_i_dsi_rest_buffer_t *registered_buffers;
92 int registered_buffers_count;
94 globus_i_dsi_rest_buffer_t *free_buffers;
96globus_i_dsi_rest_gridftp_op_arg_t;
100struct globus_i_dsi_rest_write_multipart_arg_s
105 char *current_boundary;
106 size_t current_boundary_offset;
107 size_t current_boundary_length;
108 struct globus_i_dsi_rest_write_part_s
111globus_i_dsi_rest_write_multipart_arg_t;
114struct globus_i_dsi_rest_write_block_arg_s
123globus_i_dsi_rest_write_block_arg_t;
126struct globus_i_dsi_rest_write_blocks_arg_s
129 size_t current_block;
130 globus_i_dsi_rest_write_block_arg_t*blocks;
132globus_i_dsi_rest_write_blocks_arg_t;
135struct globus_i_dsi_rest_write_part_s
141 void *data_write_callback_arg;
143globus_i_dsi_rest_write_part_t;
146struct globus_i_dsi_rest_read_part_s
151 void *response_callback_arg;
154 void *data_read_callback_arg;
157 void *data_peek_callback_arg;
159globus_i_dsi_rest_read_part_t;
162struct globus_i_dsi_rest_read_multipart_arg_s
166 globus_i_dsi_rest_read_part_t *parts;
169 size_t boundary_length;
171 char *boundary_buffer;
172 size_t boundary_buffer_length;
173 size_t boundary_buffer_offset;
175 size_t match_counter;
179 size_t header_buffer_offset;
181globus_i_dsi_rest_read_multipart_arg_t;
187struct globus_i_dsi_rest_request_s
190 globus_result_t result;
193 char response_reason[64];
194 struct curl_slist *request_headers;
197 off_t request_bytes_uploaded;
198 off_t response_bytes_downloaded;
200 globus_i_dsi_rest_write_part_t write_part;
201 globus_i_dsi_rest_read_part_t read_part;
204 void *response_callback_arg;
207 void *complete_callback_arg;
210 void *progress_callback_arg;
212 globus_i_dsi_rest_idle_arg_t idle_arg;
214 uint64_t request_content_length;
215 bool request_content_length_set;
217globus_i_dsi_rest_request_t;
234globus_i_dsi_rest_handle_get(
250globus_i_dsi_rest_handle_release(
255globus_i_dsi_rest_compute_headers(
256 struct curl_slist **request_headers,
260globus_i_dsi_rest_set_request(
264 struct curl_slist *headers,
265 const globus_dsi_rest_callbacks_t *callbacks);
268globus_i_dsi_rest_add_header(
269 struct curl_slist **request_headers,
270 const char *header_name,
271 const char *header_value);
274globus_i_dsi_rest_perform(
275 globus_i_dsi_rest_request_t *request);
278globus_i_dsi_rest_encode_form_data(
282globus_i_dsi_rest_buffer_t *
283globus_i_dsi_rest_buffer_get(
284 globus_i_dsi_rest_gridftp_op_arg_t *gridftp_op_arg,
288globus_i_dsi_rest_uri_escape(
294globus_i_dsi_rest_multipart_boundary_prepare(
295 const char *delimiter,
299 size_t *boundary_lengthp);
302globus_i_dsi_rest_request_cleanup(
303 globus_i_dsi_rest_request_t *request);
307globus_i_dsi_rest_xferinfo(
315globus_i_dsi_rest_progress(
323globus_i_dsi_rest_header(
330globus_i_dsi_rest_header_parse(
336globus_i_dsi_rest_write_data(
343globus_i_dsi_rest_read_data(
349#define GlobusDsiRestErrorParameter() \
350 globus_error_put(GlobusDsiRestErrorParameterObject())
351#define GlobusDsiRestErrorMemory() \
352 globus_error_put(GlobusDsiRestErrorMemoryObject())
353#define GlobusDsiRestErrorParse(s) \
354 globus_error_put(GlobusDsiRestErrorParseObject(s))
355#define GlobusDsiRestErrorCurl(rc) \
356 globus_error_put(GlobusDsiRestErrorCurlObject(rc))
357#define GlobusDsiRestErrorJson(buffer, buffer_len, err) \
358 globus_error_put(GlobusDsiRestErrorJsonObject(buffer, buffer_len, err))
359#define GlobusDsiRestErrorTimeOut() \
360 globus_error_put(GlobusDsiRestErrorTimeOutObject())
361#define GlobusDsiRestErrorThreadFail(rc) \
362 globus_error_put(GlobusDsiRestErrorThreadFailObject(rc))
363#define GlobusDsiRestErrorUnexpectedData(s, len) \
364 globus_error_put(GlobusDsiRestErrorUnexpectedDataObject(s, len))
366#define GlobusDsiRestErrorParameterObject() \
367 globus_error_construct_error( \
368 GLOBUS_DSI_REST_MODULE, \
370 GLOBUS_DSI_REST_ERROR_PARAMETER, \
375#define GlobusDsiRestErrorMemoryObject() \
376 globus_error_construct_error( \
377 GLOBUS_DSI_REST_MODULE, \
379 GLOBUS_DSI_REST_ERROR_MEMORY, \
385#define GlobusDsiRestErrorParseObject(s) \
386 globus_error_construct_error( \
387 GLOBUS_DSI_REST_MODULE, \
389 GLOBUS_DSI_REST_ERROR_PARSE, \
393 "Unable to parse %s", s)
395#define GlobusDsiRestErrorCurlObject(rc) \
396 globus_error_construct_error( \
397 GLOBUS_DSI_REST_MODULE, \
399 GLOBUS_DSI_REST_ERROR_CURL, \
403 "libcurl error %d: %s", rc, curl_easy_strerror(rc))
404#define GlobusDsiRestErrorJsonObject(buffer, buffer_len, err) \
405 globus_error_construct_error( \
406 GLOBUS_DSI_REST_MODULE, \
408 GLOBUS_DSI_REST_ERROR_JSON, \
412 "Error parsing \"%.*s\" as json: %s", \
413 (int) buffer_len, buffer, (err)->text)
414#define GlobusDsiRestErrorTimeOutObject() \
415 globus_error_construct_error( \
416 GLOBUS_DSI_REST_MODULE, \
418 GLOBUS_DSI_REST_ERROR_TIME_OUT, \
422 "Operation timed out")
423#define GlobusDsiRestErrorThreadFailObject(rc) \
424 globus_error_construct_error( \
425 GLOBUS_DSI_REST_MODULE, \
427 GLOBUS_DSI_REST_ERROR_THREAD_FAIL, \
431 "Thread create failed: %d", rc)
432#define GlobusDsiRestErrorUnexpectedDataObject(s,len) \
433 globus_error_construct_error( \
434 GLOBUS_DSI_REST_MODULE, \
436 GLOBUS_DSI_REST_ERROR_UNEXPECTED_DATA, \
440 "Unexpected data failed: %.*s", (int)len, s)
443GlobusDebugDeclare(GLOBUS_DSI_REST);
447 GLOBUS_DSI_REST_DATA = 1<<0,
448 GLOBUS_DSI_REST_TRACE = 1<<1,
449 GLOBUS_DSI_REST_INFO = 1<<2,
450 GLOBUS_DSI_REST_DEBUG = 1<<3,
451 GLOBUS_DSI_REST_WARN = 1<<4,
452 GLOBUS_DSI_REST_ERROR = 1<<5,
455extern const char * globus_i_dsi_rest_debug_level_names[];
457#define GlobusDsiRestLog(level, ...) \
459 int level__ = level; \
460 if (level__ > GLOBUS_DSI_REST_ERROR \
462 || globus_i_dsi_rest_debug_level_names[level__] == NULL) \
466 if (GlobusDebugTrue(GLOBUS_DSI_REST, level__)) \
468 flockfile(GlobusDebugMyFile(GLOBUS_DSI_REST)); \
469 GlobusDebugPrintf(GLOBUS_DSI_REST, level__, \
470 ("dsi_rest: %5s: %"PRIiMAX": %s: ", \
471 globus_i_dsi_rest_debug_level_names[level__], \
472 (intmax_t) getpid(), __func__)); \
473 GlobusDebugMyPrintf(GLOBUS_DSI_REST, \
475 funlockfile(GlobusDebugMyFile(GLOBUS_DSI_REST)); \
479#define GlobusDsiRestData(...) GlobusDsiRestLog(GLOBUS_DSI_REST_DATA, __VA_ARGS__)
480#define GlobusDsiRestTrace(...) GlobusDsiRestLog(GLOBUS_DSI_REST_TRACE, __VA_ARGS__)
481#define GlobusDsiRestInfo(...) GlobusDsiRestLog(GLOBUS_DSI_REST_INFO, __VA_ARGS__)
482#define GlobusDsiRestDebug(...) GlobusDsiRestLog(GLOBUS_DSI_REST_DEBUG, __VA_ARGS__)
483#define GlobusDsiRestWarn(...) GlobusDsiRestLog(GLOBUS_DSI_REST_WARN, __VA_ARGS__)
484#define GlobusDsiRestError(...) GlobusDsiRestLog(GLOBUS_DSI_REST_ERROR, __VA_ARGS__)
486#define GlobusDsiRestEnter() GlobusDsiRestTrace("enter\n")
487#define GlobusDsiRestExit() GlobusDsiRestTrace("exit\n")
488#define GlobusDsiRestExitResult(result) \
490 if (GlobusDebugTrue(GLOBUS_DSI_REST, GLOBUS_DSI_REST_TRACE)) \
492 if (result == GLOBUS_SUCCESS) \
494 GlobusDsiRestTrace("exit: Success");\
499 globus_object_t * obj = globus_error_peek(result); \
500 errstr = globus_error_print_friendly(obj); \
501 GlobusDsiRestTrace("exit: %#x: %s\n", (unsigned) result, errstr?errstr:"UNKNOWN ERROR"); \
502 if (errstr != NULL) \
509#define GlobusDsiRestExitSizeT(size) GlobusDsiRestTrace("exit: %zu\n", size)
510#define GlobusDsiRestExitInt(rc) GlobusDsiRestTrace("exit: %d\n", rc)
511#define GlobusDsiRestExitBool(rc) GlobusDsiRestTrace("exit: %s\n", rc?"true":"false")
512#define GlobusDsiRestExitPointer(p) GlobusDsiRestTrace("exit: %p\n", (void *)p)
514#define GlobusDsiRestLogResult(level, result) \
516 int __level = level; \
517 if (GlobusDebugTrue(GLOBUS_DSI_REST, (__level))) \
519 globus_object_t * obj = globus_error_peek(result); \
520 char *errstr = obj?globus_error_print_friendly(obj):strdup("Success"); \
521 GlobusDsiRestLog(__level, "result=%#x message=%s\n", \
522 (unsigned int) result, \
523 errstr?errstr:"UNKNOWN ERROR"); \
528extern globus_mutex_t globus_i_dsi_rest_handle_cache_mutex;
529extern size_t globus_i_dsi_rest_handle_cache_index;
530extern CURL *globus_i_dsi_rest_handle_cache[];
531extern CURLSH *globus_i_dsi_rest_share;
533enum { GLOBUS_I_DSI_REST_HANDLE_CACHE_SIZE = 16 };
globus_result_t(* globus_dsi_rest_read_t)(void *read_callback_arg, void *buffer, size_t buffer_length)
Data Read Callback Signature.
Definition globus_dsi_rest.h:207
globus_result_t(* globus_dsi_rest_write_t)(void *write_callback_arg, void *buffer, size_t buffer_length, size_t *amount_copied)
Data Write Callback Signature.
Definition globus_dsi_rest.h:168
globus_result_t(* globus_dsi_rest_progress_t)(void *progress_callback_arg, uint64_t total_read, uint64_t amt_read, uint64_t total_written, uint64_t amt_written)
Request Progress Callback Signature.
Definition globus_dsi_rest.h:268
void(* globus_dsi_rest_complete_t)(void *complete_callback_arg, globus_result_t result)
Request Complete Callback Signature.
Definition globus_dsi_rest.h:230
globus_result_t(* globus_dsi_rest_response_t)(void *response_callback_arg, int response_code, const char *response_status, const globus_dsi_rest_key_array_t *response_headers)
Response Callback Signature.
Definition globus_dsi_rest.h:130
struct globus_dsi_rest_key_array_s globus_dsi_rest_key_array_t
Key-Value Pair Array.