2 #ifndef GLOBUS_DONT_DOCUMENT_INTERNAL
9 #ifndef GLOBUS_I_XIO_HTTP_H
10 #define GLOBUS_I_XIO_HTTP_H 1
12 #include "globus_xio.h"
13 #include "globus_xio_driver.h"
16 enum { GLOBUS_XIO_HTTP_CHUNK_SIZE = 4000 };
20 GLOBUS_XIO_HTTP_TRANSFER_ENCODING_DEFAULT,
21 GLOBUS_XIO_HTTP_TRANSFER_ENCODING_IDENTITY,
22 GLOBUS_XIO_HTTP_TRANSFER_ENCODING_CHUNKED
24 globus_i_xio_http_transfer_encoding_t;
28 GLOBUS_XIO_HTTP_PRE_REQUEST_LINE,
29 GLOBUS_XIO_HTTP_REQUEST_LINE,
30 GLOBUS_XIO_HTTP_STATUS_LINE,
31 GLOBUS_XIO_HTTP_HEADERS,
32 GLOBUS_XIO_HTTP_CHUNK_CRLF,
33 GLOBUS_XIO_HTTP_CHUNK_LINE,
34 GLOBUS_XIO_HTTP_CHUNK_FOOTERS,
35 GLOBUS_XIO_HTTP_CHUNK_BODY,
36 GLOBUS_XIO_HTTP_IDENTITY_BODY,
40 globus_i_xio_http_parse_state_t;
44 struct globus_i_xio_http_handle_s * http_handle;
45 globus_xio_operation_t user_read_op;
46 globus_xio_operation_t internal_op;
47 globus_xio_driver_handle_t driver_handle;
49 globus_i_xio_http_cancellation_t;
51 #define GLOBUS_XIO_HTTP_COPY_BLOB(fifo, blob, len, label) \
53 result = globus_i_xio_http_copy_blob(fifo, blob, len); \
54 if (result != GLOBUS_SUCCESS) \
65 globus_xio_iovec_t * iov;
73 globus_xio_operation_t operation;
77 globus_xio_driver_handle_t driver_handle;
90 globus_byte_t chunk_size_buffer[64];
92 globus_i_xio_http_operation_info_t;
94 #define GLOBUS_XIO_ARRAY_LENGTH(x) (sizeof(x)/sizeof(x[0]))
97 #define GLOBUS_XIO_HTTP_TODO(msg) \
99 globus_libc_fprintf(stderr, "TODO: %s\n", msg); \
102 #define GLOBUS_XIO_HTTP_TODO(msg) \
104 globus_libc_fprintf(stderr, "TODO: %s\n", msg); \
118 globus_bool_t is_client;
133 globus_i_xio_http_target_t;
146 GLOBUS_I_XIO_HTTP_HEADER_ENTITY_NEEDED = 1 << 0,
150 GLOBUS_I_XIO_HTTP_HEADER_CONTENT_LENGTH_SET = 1 << 1,
154 GLOBUS_I_XIO_HTTP_HEADER_CONNECTION_CLOSE = 1 << 2
156 globus_i_xio_http_header_flags_t;
160 #define GLOBUS_I_XIO_HTTP_HEADER_IS_ENTITY_NEEDED(header) \
161 ((header)->flags & GLOBUS_I_XIO_HTTP_HEADER_ENTITY_NEEDED)
162 #define GLOBUS_I_XIO_HTTP_HEADER_IS_CONTENT_LENGTH_SET(header) \
163 ((header)->flags & GLOBUS_I_XIO_HTTP_HEADER_CONTENT_LENGTH_SET)
164 #define GLOBUS_I_XIO_HTTP_HEADER_IS_CONNECTION_CLOSE(header) \
165 ((header)->flags & GLOBUS_I_XIO_HTTP_HEADER_CONNECTION_CLOSE)
180 globus_hashtable_t headers;
184 globus_off_t content_length;
188 globus_i_xio_http_transfer_encoding_t
193 globus_i_xio_http_header_flags_t flags;
195 globus_i_xio_http_header_info_t;
233 globus_i_xio_http_header_info_t headers;
235 globus_i_xio_http_request_t;
257 char * reason_phrase;
269 globus_i_xio_http_header_info_t headers;
271 globus_i_xio_http_response_t;
273 typedef struct globus_i_xio_http_handle_s
278 globus_i_xio_http_target_t target_info;
282 globus_i_xio_http_request_t request_info;
287 globus_i_xio_http_response_t response_info;
291 globus_xio_driver_handle_t handle;
296 globus_xio_iovec_t * header_iovec;
305 globus_xio_iovec_t read_buffer;
311 globus_xio_iovec_t read_iovec;
316 globus_size_t read_buffer_offset;
322 globus_size_t read_buffer_valid;
327 globus_xio_operation_t close_operation;
332 globus_size_t read_chunk_left;
336 globus_bool_t delay_write_header;
340 const globus_xio_iovec_t * first_write_iovec;
344 int first_write_iovec_count;
348 globus_i_xio_http_parse_state_t parse_state;
352 globus_i_xio_http_parse_state_t send_state;
358 globus_xio_operation_t response_read_operation;
361 globus_i_xio_http_operation_info_t read_operation;
362 globus_i_xio_http_operation_info_t write_operation;
367 globus_bool_t user_close;
373 globus_bool_t read_response;
378 globus_mutex_t mutex;
383 globus_i_xio_http_cancellation_t * cancellation;
389 globus_bool_t reopen_in_progress;
394 globus_object_t * pending_error;
396 globus_i_xio_http_handle_t;
406 globus_i_xio_http_request_t request;
407 globus_bool_t delay_write_header;
410 globus_i_xio_http_response_t response;
412 globus_i_xio_http_attr_t;
417 globus_i_xio_http_copy_blob(
418 globus_fifo_t * fifo,
424 globus_i_xio_http_find_eol(
426 globus_size_t blob_length);
430 globus_i_xio_http_method_requires_entity(
431 const char * method);
435 globus_i_xio_http_guess_version(
441 globus_i_xio_http_clean_read_buffer(
442 globus_i_xio_http_handle_t * http_handle);
447 globus_i_xio_http_attr_init(
452 globus_i_xio_http_attr_cntl(
459 globus_i_xio_http_attr_copy(
465 globus_i_xio_http_attr_destroy(
471 globus_i_xio_http_client_write_request(
472 globus_xio_operation_t op,
473 globus_i_xio_http_handle_t * http_handle);
477 globus_i_xio_http_client_open_callback(
478 globus_xio_operation_t op,
479 globus_result_t result,
485 globus_i_xio_http_handle_init(
486 globus_i_xio_http_handle_t * http_handle,
487 globus_i_xio_http_attr_t * attr,
488 globus_i_xio_http_target_t * target);
492 globus_i_xio_http_handle_reinit(
493 globus_i_xio_http_handle_t * http_handle,
494 globus_i_xio_http_attr_t * http_attr,
495 globus_i_xio_http_target_t * http_target);
499 globus_i_xio_http_handle_destroy(
500 globus_i_xio_http_handle_t * http_handle);
504 globus_i_xio_http_handle_cntl(
511 globus_i_xio_http_set_end_of_entity(
512 globus_i_xio_http_handle_t * http_handle);
517 globus_i_xio_http_header_copy(
525 globus_i_xio_http_header_destroy(
530 globus_i_xio_http_header_parse(
531 globus_i_xio_http_handle_t * handle,
532 globus_bool_t * done);
537 globus_i_xio_http_header_info_init(
538 globus_i_xio_http_header_info_t * headers);
542 globus_i_xio_http_header_info_destroy(
543 globus_i_xio_http_header_info_t * headers);
547 globus_i_xio_http_header_info_copy(
548 globus_i_xio_http_header_info_t * dest,
549 const globus_i_xio_http_header_info_t *
553 globus_i_xio_http_header_info_set_header(
554 globus_i_xio_http_header_info_t * headers,
555 const char * header_name,
556 const char * header_value,
557 globus_bool_t store_all);
562 globus_i_xio_http_lookup_reason(
567 globus_i_xio_http_target_t *
568 globus_i_xio_http_target_new(
void);
572 globus_i_xio_http_target_destroy(
573 void * driver_target);
577 globus_i_xio_http_target_destroy_internal(
578 globus_i_xio_http_target_t * target);
583 globus_i_xio_http_request_init(
584 globus_i_xio_http_request_t * request);
588 globus_i_xio_http_request_copy(
589 globus_i_xio_http_request_t * dest,
590 const globus_i_xio_http_request_t * src);
594 globus_i_xio_http_request_destroy(
595 globus_i_xio_http_request_t * request);
600 globus_i_xio_http_response_init(
601 globus_i_xio_http_response_t * response);
605 globus_i_xio_http_response_copy(
606 globus_i_xio_http_response_t * dest,
607 const globus_i_xio_http_response_t *src);
611 globus_i_xio_http_response_destroy(
612 globus_i_xio_http_response_t * response);
618 globus_i_xio_http_server_read_request_callback(
619 globus_xio_operation_t op,
620 globus_result_t result,
621 globus_size_t nbytes,
626 globus_i_xio_http_accept(
627 void * driver_server,
628 globus_xio_operation_t accept_op);
632 globus_i_xio_http_server_open_callback(
633 globus_xio_operation_t op,
634 globus_result_t result,
639 globus_i_xio_http_server_write_response(
640 globus_i_xio_http_handle_t * http_handle,
641 const globus_xio_iovec_t * iovec,
643 globus_xio_operation_t op);
647 globus_i_xio_http_server_read_next_request(
648 globus_i_xio_http_handle_t * http_handle);
653 globus_i_xio_http_target_init(
654 globus_i_xio_http_target_t ** out_target,
655 const globus_xio_contact_t * contact_info);
659 globus_i_xio_http_target_copy(
660 globus_i_xio_http_target_t * dest,
661 const globus_i_xio_http_target_t * src);
664 extern globus_list_t * globus_i_xio_http_cached_handles;
665 extern globus_mutex_t globus_i_xio_http_cached_handle_mutex;
666 extern globus_list_t * globus_i_xio_http_cancellable_handles;
667 extern globus_mutex_t globus_i_xio_http_cancel_mutex;
671 globus_i_xio_http_open(
672 const globus_xio_contact_t * contact_info,
675 globus_xio_operation_t op);
679 globus_i_xio_http_read(
681 const globus_xio_iovec_t * iovec,
683 globus_xio_operation_t op);
687 globus_i_xio_http_write(
689 const globus_xio_iovec_t * iovec,
691 globus_xio_operation_t op);
696 globus_l_xio_http_client_parse_response(
697 globus_i_xio_http_handle_t * http_handle,
698 globus_bool_t * done);
701 globus_l_xio_http_client_read_response_callback(
702 globus_xio_operation_t op,
703 globus_result_t result,
704 globus_size_t nbytes,
709 globus_i_xio_http_parse_residue(
710 globus_i_xio_http_handle_t * handle,
711 globus_bool_t * registered_again);
715 globus_i_xio_http_write_chunk(
716 globus_i_xio_http_handle_t * http_handle,
717 const globus_xio_iovec_t * iovec,
719 globus_xio_operation_t op);
723 globus_i_xio_http_write_callback(
724 globus_xio_operation_t op,
725 globus_result_t result,
726 globus_size_t nbytes,
731 globus_i_xio_http_close(
734 globus_xio_operation_t op);
738 globus_i_xio_http_close_internal(
739 globus_i_xio_http_handle_t * http_handle);
743 globus_i_xio_http_close_callback(
744 globus_xio_operation_t operation,
745 globus_result_t result,
748 GlobusXIODeclareModule(http);
749 #define GLOBUS_XIO_HTTP_MODULE GlobusXIOMyModule(http)
751 #define GlobusXIOHttpErrorObjParse(token, context) \
752 globus_error_construct_error( \
753 GLOBUS_XIO_HTTP_MODULE, \
755 GLOBUS_XIO_HTTP_ERROR_PARSE, \
759 "Error parsing %s token at %s", \
762 #define GlobusXIOHttpErrorParse(token, context) \
764 GlobusXIOHttpErrorObjParse(token, context))
766 #define GlobusXIOHttpErrorObjInvalidHeader(name, value) \
767 globus_error_construct_error( \
768 GLOBUS_XIO_HTTP_MODULE, \
770 GLOBUS_XIO_HTTP_ERROR_INVALID_HEADER, \
774 "Invalid %s header value %s", \
777 #define GlobusXIOHttpErrorInvalidHeader(name, value) \
779 GlobusXIOHttpErrorObjInvalidHeader(name, value))
781 #define GlobusXIOHttpErrorObjNoEntity() \
782 globus_error_construct_error( \
783 GLOBUS_XIO_HTTP_MODULE, \
785 GLOBUS_XIO_HTTP_ERROR_NO_ENTITY, \
789 "No entity to read or write")
791 #define GlobusXIOHttpErrorNoEntity() \
793 GlobusXIOHttpErrorObjNoEntity())
795 #define GlobusXIOHttpErrorObjEOF() \
796 globus_error_construct_error( \
797 GLOBUS_XIO_HTTP_MODULE, \
799 GLOBUS_XIO_HTTP_ERROR_EOF, \
805 #define GlobusXIOHttpErrorEOF() \
807 GlobusXIOHttpErrorObjEOF())
809 #define GlobusXIOHttpErrorPersistentConnectionDropped(cause) \
811 GlobusXIOHTTPErrorObjPersistentConnectionDropped(cause))
813 #define GlobusXIOHTTPErrorObjPersistentConnectionDropped(cause) \
814 globus_error_construct_error( \
815 GLOBUS_XIO_HTTP_MODULE, \
817 GLOBUS_XIO_HTTP_ERROR_PERSISTENT_CONNECTION_DROPPED, \
821 "Persistent connection dropped")
Globus XIO HTTP Driver Header.
globus_xio_http_version_t
Definition: globus_xio_http.h:209