17 #ifndef GLOBUS_DONT_DOCUMENT_INTERNAL
22 #ifndef GLOBUS_I_DSI_REST_H
23 #define GLOBUS_I_DSI_REST_H
32 #include "globus_common.h"
33 #include "globus_gridftp_server.h"
35 #include <curl/curl.h>
39 struct globus_i_dsi_rest_read_json_arg_s
46 globus_i_dsi_rest_read_json_arg_t;
49 globus_i_dsi_rest_buffer_s
53 uint64_t transfer_offset;
54 struct globus_i_dsi_rest_buffer_s *next;
55 unsigned char buffer[];
57 globus_i_dsi_rest_buffer_t;
60 globus_i_dsi_rest_idle_arg_s
62 globus_abstime_t last_activity;
63 uintptr_t idle_timeout;
64 uint64_t last_amt_read;
65 uint64_t last_amt_written;
67 globus_i_dsi_rest_idle_arg_t;
70 struct globus_i_dsi_rest_gridftp_op_arg_s
72 globus_gfs_operation_t op;
75 globus_result_t result;
85 globus_i_dsi_rest_buffer_t *pending_buffers;
86 globus_i_dsi_rest_buffer_t **pending_buffers_last;
87 globus_i_dsi_rest_buffer_t *current_buffer;
88 globus_i_dsi_rest_buffer_t *registered_buffers;
89 globus_i_dsi_rest_buffer_t *free_buffers;
91 globus_i_dsi_rest_gridftp_op_arg_t;
95 struct globus_i_dsi_rest_multipart_arg_s
100 char *current_boundary;
101 size_t current_boundary_offset;
102 size_t current_boundary_length;
103 struct globus_i_dsi_rest_part_s *parts;
105 globus_i_dsi_rest_multipart_arg_t;
108 struct globus_i_dsi_rest_part_s
114 void *data_write_callback_arg;
118 globus_i_dsi_rest_gridftp_op_arg_t gridftp_op_arg;
119 globus_i_dsi_rest_multipart_arg_t multipart_write_arg;
121 globus_i_dsi_rest_part_t;
127 struct globus_i_dsi_rest_request_s
130 globus_result_t result;
133 char response_reason[64];
134 struct curl_slist *request_headers;
138 off_t request_bytes_uploaded;
139 off_t response_bytes_downloaded;
141 globus_thread_t thread;
143 globus_i_dsi_rest_part_t write_part;
144 globus_i_dsi_rest_read_json_arg_t read_json_arg;
145 globus_i_dsi_rest_gridftp_op_arg_t read_gridftp_op_arg;
148 void *data_read_callback_arg;
151 void *response_callback_arg;
154 void *complete_callback_arg;
157 void *progress_callback_arg;
159 globus_i_dsi_rest_idle_arg_t idle_arg;
161 uint64_t request_content_length;
162 bool request_content_length_set;
164 globus_i_dsi_rest_request_t;
181 globus_i_dsi_rest_handle_get(
197 globus_i_dsi_rest_handle_release(
202 globus_i_dsi_rest_compute_headers(
203 struct curl_slist **request_headers,
207 globus_i_dsi_rest_set_request(
211 struct curl_slist *headers,
212 const globus_dsi_rest_callbacks_t *callbacks);
215 globus_i_dsi_rest_add_header(
216 struct curl_slist **request_headers,
217 const char *header_name,
218 const char *header_value);
221 globus_i_dsi_rest_perform(
222 globus_i_dsi_rest_request_t *request);
225 globus_i_dsi_rest_encode_form_data(
229 globus_i_dsi_rest_buffer_t *
230 globus_i_dsi_rest_buffer_get(
231 globus_i_dsi_rest_gridftp_op_arg_t *gridftp_op_arg,
235 globus_i_dsi_rest_uri_escape(
241 globus_i_dsi_rest_multipart_boundary_prepare(
242 const char *delimiter,
246 size_t *boundary_lengthp);
249 globus_i_dsi_rest_request_cleanup(
250 globus_i_dsi_rest_request_t *request);
254 globus_i_dsi_rest_xferinfo(
262 globus_i_dsi_rest_progress(
270 globus_i_dsi_rest_header(
277 globus_i_dsi_rest_write_data(
284 globus_i_dsi_rest_read_data(
292 GLOBUS_DSI_REST_ERROR_PARAMETER = 1,
293 GLOBUS_DSI_REST_ERROR_MEMORY,
294 GLOBUS_DSI_REST_ERROR_PARSE,
295 GLOBUS_DSI_REST_ERROR_CURL,
296 GLOBUS_DSI_REST_ERROR_JSON,
297 GLOBUS_DSI_REST_ERROR_TIME_OUT,
298 GLOBUS_DSI_REST_ERROR_THREAD_FAIL,
299 GLOBUS_DSI_REST_ERROR_UNEXPECTED_DATA,
302 #define GlobusDsiRestErrorParameter() \
303 globus_error_put(GlobusDsiRestErrorParameterObject())
304 #define GlobusDsiRestErrorMemory() \
305 globus_error_put(GlobusDsiRestErrorMemoryObject())
306 #define GlobusDsiRestErrorParse(s) \
307 globus_error_put(GlobusDsiRestErrorParseObject(s))
308 #define GlobusDsiRestErrorCurl(rc) \
309 globus_error_put(GlobusDsiRestErrorCurlObject(rc))
310 #define GlobusDsiRestErrorJson(err) \
311 globus_error_put(GlobusDsiRestErrorJsonObject(err))
312 #define GlobusDsiRestErrorTimeOut() \
313 globus_error_put(GlobusDsiRestErrorTimeOutObject())
314 #define GlobusDsiRestErrorThreadFail(rc) \
315 globus_error_put(GlobusDsiRestErrorThreadFailObject(rc))
316 #define GlobusDsiRestErrorUnexpectedData(s, len) \
317 globus_error_put(GlobusDsiRestErrorUnexpectedDataObject(s, len))
319 #define GlobusDsiRestErrorParameterObject() \
320 globus_error_construct_error( \
321 GLOBUS_DSI_REST_MODULE, \
323 GLOBUS_DSI_REST_ERROR_PARAMETER, \
328 #define GlobusDsiRestErrorMemoryObject() \
329 globus_error_construct_error( \
330 GLOBUS_DSI_REST_MODULE, \
332 GLOBUS_DSI_REST_ERROR_MEMORY, \
338 #define GlobusDsiRestErrorParseObject(s) \
339 globus_error_construct_error( \
340 GLOBUS_DSI_REST_MODULE, \
342 GLOBUS_DSI_REST_ERROR_PARSE, \
346 "Unable to parse %s", s)
348 #define GlobusDsiRestErrorCurlObject(rc) \
349 globus_error_construct_error( \
350 GLOBUS_DSI_REST_MODULE, \
352 GLOBUS_DSI_REST_ERROR_CURL, \
356 "libcurl error %d: %s", rc, curl_easy_strerror(rc))
357 #define GlobusDsiRestErrorJsonObject(err) \
358 globus_error_construct_error( \
359 GLOBUS_DSI_REST_MODULE, \
361 GLOBUS_DSI_REST_ERROR_JSON, \
365 "json error %s", (err)->text)
366 #define GlobusDsiRestErrorTimeOutObject() \
367 globus_error_construct_error( \
368 GLOBUS_DSI_REST_MODULE, \
370 GLOBUS_DSI_REST_ERROR_TIME_OUT, \
374 "Operation timed out")
375 #define GlobusDsiRestErrorThreadFailObject(rc) \
376 globus_error_construct_error( \
377 GLOBUS_DSI_REST_MODULE, \
379 GLOBUS_DSI_REST_ERROR_THREAD_FAIL, \
383 "Thread create failed: %d", rc)
384 #define GlobusDsiRestErrorUnexpectedDataObject(s,len) \
385 globus_error_construct_error( \
386 GLOBUS_DSI_REST_MODULE, \
388 GLOBUS_DSI_REST_ERROR_UNEXPECTED_DATA, \
392 "Unexpected data failed: %.*s", (int)len, s)
395 GlobusDebugDeclare(GLOBUS_DSI_REST);
399 GLOBUS_DSI_REST_DATA = 1<<0,
400 GLOBUS_DSI_REST_TRACE = 1<<1,
401 GLOBUS_DSI_REST_INFO = 1<<2,
402 GLOBUS_DSI_REST_DEBUG = 1<<3,
403 GLOBUS_DSI_REST_WARN = 1<<4,
404 GLOBUS_DSI_REST_ERROR = 1<<5,
407 extern const char * globus_i_dsi_rest_debug_level_names[];
409 #define GlobusDsiRestLog(level, ...) \
411 int level__ = level; \
412 if (level__ > GLOBUS_DSI_REST_ERROR || level__ < 0) { \
415 if (GlobusDebugTrue(GLOBUS_DSI_REST, level__)) \
417 flockfile(GlobusDebugMyFile(GLOBUS_DSI_REST)); \
418 GlobusDebugPrintf(GLOBUS_DSI_REST, level__, \
419 ("dsi_rest: %5s: %"PRIiMAX": %s: ", \
420 globus_i_dsi_rest_debug_level_names[level__], \
421 (intmax_t) getpid(), __func__)); \
422 GlobusDebugMyPrintf(GLOBUS_DSI_REST, \
424 funlockfile(GlobusDebugMyFile(GLOBUS_DSI_REST)); \
428 #define GlobusDsiRestData(...) GlobusDsiRestLog(GLOBUS_DSI_REST_DATA, __VA_ARGS__)
429 #define GlobusDsiRestTrace(...) GlobusDsiRestLog(GLOBUS_DSI_REST_TRACE, __VA_ARGS__)
430 #define GlobusDsiRestInfo(...) GlobusDsiRestLog(GLOBUS_DSI_REST_INFO, __VA_ARGS__)
431 #define GlobusDsiRestDebug(...) GlobusDsiRestLog(GLOBUS_DSI_REST_DEBUG, __VA_ARGS__)
432 #define GlobusDsiRestWarn(...) GlobusDsiRestLog(GLOBUS_DSI_REST_WARN, __VA_ARGS__)
433 #define GlobusDsiRestError(...) GlobusDsiRestLog(GLOBUS_DSI_REST_ERROR, __VA_ARGS__)
435 #define GlobusDsiRestEnter() GlobusDsiRestTrace("enter\n")
436 #define GlobusDsiRestExit() GlobusDsiRestTrace("exit\n")
437 #define GlobusDsiRestExitResult(result) \
439 if (GlobusDebugTrue(GLOBUS_DSI_REST, GLOBUS_DSI_REST_TRACE)) \
441 globus_object_t * obj = globus_error_peek(result); \
442 char *errstr = obj?globus_error_print_friendly(obj):strdup("Success"); \
443 GlobusDsiRestTrace("exit: %#x: %s\n", (unsigned) result, errstr?errstr:"UNKNOWN ERROR"); \
447 #define GlobusDsiRestExitSizeT(size) GlobusDsiRestTrace("exit: %zu\n", size)
448 #define GlobusDsiRestExitInt(rc) GlobusDsiRestTrace("exit: %d\n", rc)
449 #define GlobusDsiRestExitBool(rc) GlobusDsiRestTrace("exit: %s\n", rc?"true":"false")
450 #define GlobusDsiRestExitPointer(p) GlobusDsiRestTrace("exit: %p\n", (void *)p)
452 #define GlobusDsiRestLogResult(level, result) \
454 int __level = level; \
455 if (GlobusDebugTrue(GLOBUS_DSI_REST, (__level))) \
457 globus_object_t * obj = globus_error_peek(result); \
458 char *errstr = obj?globus_error_print_friendly(obj):strdup("Success"); \
459 GlobusDsiRestLog(__level, "result=%#x message=%s\n", \
460 (unsigned int) result, \
461 errstr?errstr:"UNKNOWN ERROR"); \
466 extern globus_mutex_t globus_i_dsi_rest_handle_cache_mutex;
467 extern size_t globus_i_dsi_rest_handle_cache_index;
468 extern CURL *globus_i_dsi_rest_handle_cache[];
470 enum { GLOBUS_I_DSI_REST_HANDLE_CACHE_SIZE = 16 };
Key-Value Pair Array.
Definition: globus_dsi_rest.h:90
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
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_read_t)(void *read_callback_arg, void *buffer, size_t buffer_length)
Data Read Callback Signature.
Definition: globus_dsi_rest.h:207
Single-block write specialization data_write_callback_arg.
Definition: globus_dsi_rest.h:427
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