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"
36 #include <curl/curl.h>
40 struct globus_i_dsi_rest_read_json_arg_s
47 globus_i_dsi_rest_read_json_arg_t;
50 globus_i_dsi_rest_buffer_s
54 uint64_t transfer_offset;
55 struct globus_i_dsi_rest_buffer_s *next;
56 unsigned char buffer[];
58 globus_i_dsi_rest_buffer_t;
61 globus_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;
68 globus_i_dsi_rest_idle_arg_t;
71 struct 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;
96 globus_i_dsi_rest_gridftp_op_arg_t;
100 struct 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
111 globus_i_dsi_rest_write_multipart_arg_t;
114 struct globus_i_dsi_rest_write_block_arg_s
123 globus_i_dsi_rest_write_block_arg_t;
126 struct globus_i_dsi_rest_write_blocks_arg_s
129 size_t current_block;
130 globus_i_dsi_rest_write_block_arg_t*blocks;
132 globus_i_dsi_rest_write_blocks_arg_t;
135 struct globus_i_dsi_rest_write_part_s
141 void *data_write_callback_arg;
143 globus_i_dsi_rest_write_part_t;
146 struct globus_i_dsi_rest_read_part_s
151 void *response_callback_arg;
154 void *data_read_callback_arg;
157 void *data_peek_callback_arg;
159 globus_i_dsi_rest_read_part_t;
162 struct 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;
181 globus_i_dsi_rest_read_multipart_arg_t;
187 struct 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;
217 globus_i_dsi_rest_request_t;
234 globus_i_dsi_rest_handle_get(
250 globus_i_dsi_rest_handle_release(
255 globus_i_dsi_rest_compute_headers(
256 struct curl_slist **request_headers,
260 globus_i_dsi_rest_set_request(
264 struct curl_slist *headers,
265 const globus_dsi_rest_callbacks_t *callbacks);
268 globus_i_dsi_rest_add_header(
269 struct curl_slist **request_headers,
270 const char *header_name,
271 const char *header_value);
274 globus_i_dsi_rest_perform(
275 globus_i_dsi_rest_request_t *request);
278 globus_i_dsi_rest_encode_form_data(
282 globus_i_dsi_rest_buffer_t *
283 globus_i_dsi_rest_buffer_get(
284 globus_i_dsi_rest_gridftp_op_arg_t *gridftp_op_arg,
288 globus_i_dsi_rest_uri_escape(
294 globus_i_dsi_rest_multipart_boundary_prepare(
295 const char *delimiter,
299 size_t *boundary_lengthp);
302 globus_i_dsi_rest_request_cleanup(
303 globus_i_dsi_rest_request_t *request);
307 globus_i_dsi_rest_xferinfo(
315 globus_i_dsi_rest_progress(
323 globus_i_dsi_rest_header(
330 globus_i_dsi_rest_header_parse(
336 globus_i_dsi_rest_write_data(
343 globus_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)
443 GlobusDebugDeclare(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,
455 extern 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"); \
528 extern globus_mutex_t globus_i_dsi_rest_handle_cache_mutex;
529 extern size_t globus_i_dsi_rest_handle_cache_index;
530 extern CURL *globus_i_dsi_rest_handle_cache[];
531 extern CURLSH *globus_i_dsi_rest_share;
533 enum { 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
Key-Value Pair Array.
Definition: globus_dsi_rest.h:92