00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef GLOBUS_DONT_DOCUMENT_INTERNAL
00018
00024 #ifndef GLOBUS_I_XIO_HTTP_H
00025 #define GLOBUS_I_XIO_HTTP_H 1
00026
00027 #include "globus_xio.h"
00028 #include "globus_xio_driver.h"
00029 #include "globus_xio_http.h"
00030
00031 enum { GLOBUS_XIO_HTTP_CHUNK_SIZE = 4000 };
00032
00033 typedef enum
00034 {
00035 GLOBUS_XIO_HTTP_TRANSFER_ENCODING_DEFAULT,
00036 GLOBUS_XIO_HTTP_TRANSFER_ENCODING_IDENTITY,
00037 GLOBUS_XIO_HTTP_TRANSFER_ENCODING_CHUNKED
00038 }
00039 globus_i_xio_http_transfer_encoding_t;
00040
00041 typedef enum
00042 {
00043 GLOBUS_XIO_HTTP_PRE_REQUEST_LINE,
00044 GLOBUS_XIO_HTTP_REQUEST_LINE,
00045 GLOBUS_XIO_HTTP_STATUS_LINE,
00046 GLOBUS_XIO_HTTP_HEADERS,
00047 GLOBUS_XIO_HTTP_CHUNK_CRLF,
00048 GLOBUS_XIO_HTTP_CHUNK_LINE,
00049 GLOBUS_XIO_HTTP_CHUNK_FOOTERS,
00050 GLOBUS_XIO_HTTP_CHUNK_BODY,
00051 GLOBUS_XIO_HTTP_IDENTITY_BODY,
00052 GLOBUS_XIO_HTTP_EOF,
00053 GLOBUS_XIO_HTTP_CLOSE
00054 }
00055 globus_i_xio_http_parse_state_t;
00056
00057 typedef struct
00058 {
00059 struct globus_i_xio_http_handle_s * http_handle;
00060 globus_xio_operation_t user_read_op;
00061 globus_xio_operation_t internal_op;
00062 globus_xio_driver_handle_t driver_handle;
00063 }
00064 globus_i_xio_http_cancellation_t;
00065
00066 #define GLOBUS_XIO_HTTP_COPY_BLOB(fifo, blob, len, label) \
00067 do { \
00068 result = globus_i_xio_http_copy_blob(fifo, blob, len); \
00069 if (result != GLOBUS_SUCCESS) \
00070 { \
00071 goto label; \
00072 } \
00073 } while (0);
00074
00075 typedef struct
00076 {
00080 globus_xio_iovec_t * iov;
00084 globus_size_t iovcnt;
00088 globus_xio_operation_t operation;
00092 globus_xio_driver_handle_t driver_handle;
00097 globus_size_t nbytes;
00101 int wait_for;
00105 globus_byte_t chunk_size_buffer[64];
00106 }
00107 globus_i_xio_http_operation_info_t;
00108
00109 #define GLOBUS_XIO_ARRAY_LENGTH(x) (sizeof(x)/sizeof(x[0]))
00110
00111 #if BUILD_DEBUG
00112 #define GLOBUS_XIO_HTTP_TODO(msg) \
00113 do { \
00114 globus_libc_fprintf(stderr, "TODO: %s\n", msg); \
00115 } while (0);
00116 #else
00117 #define GLOBUS_XIO_HTTP_TODO(msg) \
00118 do { \
00119 globus_libc_fprintf(stderr, "TODO: %s\n", msg); \
00120 abort(); \
00121 } while (0);
00122 #endif
00123
00127 typedef struct
00128 {
00133 globus_bool_t is_client;
00137 char * host;
00138
00142 unsigned short port;
00146 char * uri;
00147 }
00148 globus_i_xio_http_target_t;
00149
00150
00151 typedef enum
00152 {
00161 GLOBUS_I_XIO_HTTP_HEADER_ENTITY_NEEDED = 1 << 0,
00165 GLOBUS_I_XIO_HTTP_HEADER_CONTENT_LENGTH_SET = 1 << 1,
00169 GLOBUS_I_XIO_HTTP_HEADER_CONNECTION_CLOSE = 1 << 2
00170 }
00171 globus_i_xio_http_header_flags_t;
00172
00175 #define GLOBUS_I_XIO_HTTP_HEADER_IS_ENTITY_NEEDED(header) \
00176 ((header)->flags & GLOBUS_I_XIO_HTTP_HEADER_ENTITY_NEEDED)
00177 #define GLOBUS_I_XIO_HTTP_HEADER_IS_CONTENT_LENGTH_SET(header) \
00178 ((header)->flags & GLOBUS_I_XIO_HTTP_HEADER_CONTENT_LENGTH_SET)
00179 #define GLOBUS_I_XIO_HTTP_HEADER_IS_CONNECTION_CLOSE(header) \
00180 ((header)->flags & GLOBUS_I_XIO_HTTP_HEADER_CONNECTION_CLOSE)
00181
00186 typedef struct
00187 {
00195 globus_hashtable_t headers;
00199 globus_off_t content_length;
00203 globus_i_xio_http_transfer_encoding_t
00204 transfer_encoding;
00208 globus_i_xio_http_header_flags_t flags;
00209 }
00210 globus_i_xio_http_header_info_t;
00211
00218 typedef struct
00219 {
00228 char * uri;
00236 char * method;
00244 globus_xio_http_version_t http_version;
00248 globus_i_xio_http_header_info_t headers;
00249 }
00250 globus_i_xio_http_request_t;
00251
00258 typedef struct
00259 {
00265 int status_code;
00272 char * reason_phrase;
00280 globus_xio_http_version_t http_version;
00284 globus_i_xio_http_header_info_t headers;
00285 }
00286 globus_i_xio_http_response_t;
00287
00288 typedef struct globus_i_xio_http_handle_s
00289 {
00293 globus_i_xio_http_target_t target_info;
00297 globus_i_xio_http_request_t request_info;
00302 globus_i_xio_http_response_t response_info;
00306 globus_xio_driver_handle_t handle;
00307
00311 globus_xio_iovec_t * header_iovec;
00315 int header_iovcnt;
00316
00320 globus_xio_iovec_t read_buffer;
00321
00326 globus_xio_iovec_t read_iovec;
00327
00331 globus_size_t read_buffer_offset;
00332
00337 globus_size_t read_buffer_valid;
00338
00342 globus_xio_operation_t close_operation;
00343
00347 globus_size_t read_chunk_left;
00351 globus_bool_t delay_write_header;
00355 const globus_xio_iovec_t * first_write_iovec;
00359 int first_write_iovec_count;
00363 globus_i_xio_http_parse_state_t parse_state;
00367 globus_i_xio_http_parse_state_t send_state;
00373 globus_xio_operation_t response_read_operation;
00374
00375
00376 globus_i_xio_http_operation_info_t read_operation;
00377 globus_i_xio_http_operation_info_t write_operation;
00378
00382 globus_bool_t user_close;
00383
00388 globus_bool_t read_response;
00389
00393 globus_mutex_t mutex;
00394
00398 globus_i_xio_http_cancellation_t * cancellation;
00404 globus_bool_t reopen_in_progress;
00405
00406
00407
00408
00409 globus_object_t * pending_error;
00410 }
00411 globus_i_xio_http_handle_t;
00412
00418 typedef struct
00419 {
00420
00421 globus_i_xio_http_request_t request;
00422 globus_bool_t delay_write_header;
00423
00424
00425 globus_i_xio_http_response_t response;
00426 }
00427 globus_i_xio_http_attr_t;
00428
00429
00430 extern
00431 globus_result_t
00432 globus_i_xio_http_copy_blob(
00433 globus_fifo_t * fifo,
00434 const char * blob,
00435 size_t len);
00436
00437 extern
00438 char *
00439 globus_i_xio_http_find_eol(
00440 const char * blob,
00441 globus_size_t blob_length);
00442
00443 extern
00444 globus_bool_t
00445 globus_i_xio_http_method_requires_entity(
00446 const char * method);
00447
00448 extern
00449 globus_xio_http_version_t
00450 globus_i_xio_http_guess_version(
00451 int major_version,
00452 int minor_version);
00453
00454 extern
00455 globus_result_t
00456 globus_i_xio_http_clean_read_buffer(
00457 globus_i_xio_http_handle_t * http_handle);
00458
00459
00460 extern
00461 globus_result_t
00462 globus_i_xio_http_attr_init(
00463 void ** out_attr);
00464
00465 extern
00466 globus_result_t
00467 globus_i_xio_http_attr_cntl(
00468 void * driver_attr,
00469 int cmd,
00470 va_list ap);
00471
00472 extern
00473 globus_result_t
00474 globus_i_xio_http_attr_copy(
00475 void ** dst,
00476 void * src);
00477
00478 extern
00479 globus_result_t
00480 globus_i_xio_http_attr_destroy(
00481 void * driver_attr);
00482
00483
00484 extern
00485 globus_result_t
00486 globus_i_xio_http_client_write_request(
00487 globus_xio_operation_t op,
00488 globus_i_xio_http_handle_t * http_handle);
00489
00490 extern
00491 void
00492 globus_i_xio_http_client_open_callback(
00493 globus_xio_operation_t op,
00494 globus_result_t result,
00495 void * user_arg);
00496
00497
00498 extern
00499 globus_result_t
00500 globus_i_xio_http_handle_init(
00501 globus_i_xio_http_handle_t * http_handle,
00502 globus_i_xio_http_attr_t * attr,
00503 globus_i_xio_http_target_t * target);
00504
00505 extern
00506 globus_result_t
00507 globus_i_xio_http_handle_reinit(
00508 globus_i_xio_http_handle_t * http_handle,
00509 globus_i_xio_http_attr_t * http_attr,
00510 globus_i_xio_http_target_t * http_target);
00511
00512 extern
00513 void
00514 globus_i_xio_http_handle_destroy(
00515 globus_i_xio_http_handle_t * http_handle);
00516
00517 extern
00518 globus_result_t
00519 globus_i_xio_http_handle_cntl(
00520 void * handle,
00521 int cmd,
00522 va_list ap);
00523
00524 extern
00525 globus_result_t
00526 globus_i_xio_http_set_end_of_entity(
00527 globus_i_xio_http_handle_t * http_handle);
00528
00529
00530 extern
00531 void
00532 globus_i_xio_http_header_copy(
00533 void ** dest_key,
00534 void ** dest_datum,
00535 void * src_key,
00536 void * src_datum);
00537
00538 extern
00539 void
00540 globus_i_xio_http_header_destroy(
00541 void * header);
00542
00543 extern
00544 globus_result_t
00545 globus_i_xio_http_header_parse(
00546 globus_i_xio_http_handle_t * handle,
00547 globus_bool_t * done);
00548
00549
00550 extern
00551 globus_result_t
00552 globus_i_xio_http_header_info_init(
00553 globus_i_xio_http_header_info_t * headers);
00554
00555 extern
00556 void
00557 globus_i_xio_http_header_info_destroy(
00558 globus_i_xio_http_header_info_t * headers);
00559
00560 extern
00561 globus_result_t
00562 globus_i_xio_http_header_info_copy(
00563 globus_i_xio_http_header_info_t * dest,
00564 const globus_i_xio_http_header_info_t *
00565 src);
00566 extern
00567 globus_result_t
00568 globus_i_xio_http_header_info_set_header(
00569 globus_i_xio_http_header_info_t * headers,
00570 const char * header_name,
00571 const char * header_value,
00572 globus_bool_t store_all);
00573
00574
00575 extern
00576 const char *
00577 globus_i_xio_http_lookup_reason(
00578 int code);
00579
00580
00581 extern
00582 globus_i_xio_http_target_t *
00583 globus_i_xio_http_target_new(void);
00584
00585 extern
00586 globus_result_t
00587 globus_i_xio_http_target_destroy(
00588 void * driver_target);
00589
00590 extern
00591 void
00592 globus_i_xio_http_target_destroy_internal(
00593 globus_i_xio_http_target_t * target);
00594
00595
00596 extern
00597 globus_result_t
00598 globus_i_xio_http_request_init(
00599 globus_i_xio_http_request_t * request);
00600
00601 extern
00602 globus_result_t
00603 globus_i_xio_http_request_copy(
00604 globus_i_xio_http_request_t * dest,
00605 const globus_i_xio_http_request_t * src);
00606
00607 extern
00608 void
00609 globus_i_xio_http_request_destroy(
00610 globus_i_xio_http_request_t * request);
00611
00612
00613 extern
00614 globus_result_t
00615 globus_i_xio_http_response_init(
00616 globus_i_xio_http_response_t * response);
00617
00618 extern
00619 globus_result_t
00620 globus_i_xio_http_response_copy(
00621 globus_i_xio_http_response_t * dest,
00622 const globus_i_xio_http_response_t *src);
00623
00624 extern
00625 void
00626 globus_i_xio_http_response_destroy(
00627 globus_i_xio_http_response_t * response);
00628
00629
00630
00631 extern
00632 void
00633 globus_i_xio_http_server_read_request_callback(
00634 globus_xio_operation_t op,
00635 globus_result_t result,
00636 globus_size_t nbytes,
00637 void * user_arg);
00638
00639 extern
00640 globus_result_t
00641 globus_i_xio_http_accept(
00642 void * driver_server,
00643 globus_xio_operation_t accept_op);
00644
00645 extern
00646 void
00647 globus_i_xio_http_server_open_callback(
00648 globus_xio_operation_t op,
00649 globus_result_t result,
00650 void * user_arg);
00651
00652 extern
00653 globus_result_t
00654 globus_i_xio_http_server_write_response(
00655 globus_i_xio_http_handle_t * http_handle,
00656 const globus_xio_iovec_t * iovec,
00657 int iovec_count,
00658 globus_xio_operation_t op);
00659
00660 extern
00661 globus_result_t
00662 globus_i_xio_http_server_read_next_request(
00663 globus_i_xio_http_handle_t * http_handle);
00664
00665
00666 extern
00667 globus_result_t
00668 globus_i_xio_http_target_init(
00669 globus_i_xio_http_target_t ** out_target,
00670 const globus_xio_contact_t * contact_info);
00671
00672 extern
00673 globus_result_t
00674 globus_i_xio_http_target_copy(
00675 globus_i_xio_http_target_t * dest,
00676 const globus_i_xio_http_target_t * src);
00677
00678
00679 extern globus_list_t * globus_i_xio_http_cached_handles;
00680 extern globus_mutex_t globus_i_xio_http_cached_handle_mutex;
00681 extern globus_list_t * globus_i_xio_http_cancellable_handles;
00682 extern globus_mutex_t globus_i_xio_http_cancel_mutex;
00683
00684 extern
00685 globus_result_t
00686 globus_i_xio_http_open(
00687 const globus_xio_contact_t * contact_info,
00688 void * link,
00689 void * attr,
00690 globus_xio_operation_t op);
00691
00692 extern
00693 globus_result_t
00694 globus_i_xio_http_read(
00695 void * handle,
00696 const globus_xio_iovec_t * iovec,
00697 int iovec_count,
00698 globus_xio_operation_t op);
00699
00700 extern
00701 globus_result_t
00702 globus_i_xio_http_write(
00703 void * handle,
00704 const globus_xio_iovec_t * iovec,
00705 int iovec_count,
00706 globus_xio_operation_t op);
00707
00708
00709 extern
00710 globus_result_t
00711 globus_l_xio_http_client_parse_response(
00712 globus_i_xio_http_handle_t * http_handle,
00713 globus_bool_t * done);
00714
00715 void
00716 globus_l_xio_http_client_read_response_callback(
00717 globus_xio_operation_t op,
00718 globus_result_t result,
00719 globus_size_t nbytes,
00720 void * user_arg);
00721
00722 extern
00723 globus_result_t
00724 globus_i_xio_http_parse_residue(
00725 globus_i_xio_http_handle_t * handle,
00726 globus_bool_t * registered_again);
00727
00728 extern
00729 globus_result_t
00730 globus_i_xio_http_write_chunk(
00731 globus_i_xio_http_handle_t * http_handle,
00732 const globus_xio_iovec_t * iovec,
00733 int iovec_count,
00734 globus_xio_operation_t op);
00735
00736 extern
00737 void
00738 globus_i_xio_http_write_callback(
00739 globus_xio_operation_t op,
00740 globus_result_t result,
00741 globus_size_t nbytes,
00742 void * user_arg);
00743
00744 extern
00745 globus_result_t
00746 globus_i_xio_http_close(
00747 void * handle,
00748 void * attr,
00749 globus_xio_operation_t op);
00750
00751 extern
00752 globus_result_t
00753 globus_i_xio_http_close_internal(
00754 globus_i_xio_http_handle_t * http_handle);
00755
00756 extern
00757 void
00758 globus_i_xio_http_close_callback(
00759 globus_xio_operation_t operation,
00760 globus_result_t result,
00761 void * handle);
00762
00763 GlobusXIODeclareModule(http);
00764 #define GLOBUS_XIO_HTTP_MODULE GlobusXIOMyModule(http)
00765
00766 #define GlobusXIOHttpErrorObjParse(token, context) \
00767 globus_error_construct_error( \
00768 GLOBUS_XIO_HTTP_MODULE, \
00769 GLOBUS_NULL, \
00770 GLOBUS_XIO_HTTP_ERROR_PARSE, \
00771 __FILE__, \
00772 _xio_name, \
00773 __LINE__, \
00774 "Error parsing %s token at %s", \
00775 token, context)
00776
00777 #define GlobusXIOHttpErrorParse(token, context) \
00778 globus_error_put( \
00779 GlobusXIOHttpErrorObjParse(token, context))
00780
00781 #define GlobusXIOHttpErrorObjInvalidHeader(name, value) \
00782 globus_error_construct_error( \
00783 GLOBUS_XIO_HTTP_MODULE, \
00784 GLOBUS_NULL, \
00785 GLOBUS_XIO_HTTP_ERROR_INVALID_HEADER, \
00786 __FILE__, \
00787 _xio_name, \
00788 __LINE__, \
00789 "Invalid %s header value %s", \
00790 name, value)
00791
00792 #define GlobusXIOHttpErrorInvalidHeader(name, value) \
00793 globus_error_put( \
00794 GlobusXIOHttpErrorObjInvalidHeader(name, value))
00795
00796 #define GlobusXIOHttpErrorObjNoEntity() \
00797 globus_error_construct_error( \
00798 GLOBUS_XIO_HTTP_MODULE, \
00799 GLOBUS_NULL, \
00800 GLOBUS_XIO_HTTP_ERROR_NO_ENTITY, \
00801 __FILE__, \
00802 _xio_name, \
00803 __LINE__, \
00804 "No entity to read or write")
00805
00806 #define GlobusXIOHttpErrorNoEntity() \
00807 globus_error_put( \
00808 GlobusXIOHttpErrorObjNoEntity())
00809
00810 #define GlobusXIOHttpErrorObjEOF() \
00811 globus_error_construct_error( \
00812 GLOBUS_XIO_HTTP_MODULE, \
00813 GLOBUS_NULL, \
00814 GLOBUS_XIO_HTTP_ERROR_EOF, \
00815 __FILE__, \
00816 _xio_name, \
00817 __LINE__, \
00818 "End of Entity")
00819
00820 #define GlobusXIOHttpErrorEOF() \
00821 globus_error_put( \
00822 GlobusXIOHttpErrorObjEOF())
00823
00824 #define GlobusXIOHttpErrorPersistentConnectionDropped(cause) \
00825 globus_error_put( \
00826 GlobusXIOHTTPErrorObjPersistentConnectionDropped(cause))
00827
00828 #define GlobusXIOHTTPErrorObjPersistentConnectionDropped(cause) \
00829 globus_error_construct_error( \
00830 GLOBUS_XIO_HTTP_MODULE, \
00831 cause, \
00832 GLOBUS_XIO_HTTP_ERROR_PERSISTENT_CONNECTION_DROPPED, \
00833 __FILE__, \
00834 _xio_name, \
00835 __LINE__, \
00836 "Persistent connection dropped")
00837
00838 #endif
00839
00840 #endif