builtins/http/globus_i_xio_http.h

00001 /*
00002  * Copyright 1999-2006 University of Chicago
00003  * 
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  * 
00008  * http://www.apache.org/licenses/LICENSE-2.0
00009  * 
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
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     /* error from internal response read, usually with a broken persistent
00407      * connection
00408      */
00409     globus_object_t *                   pending_error;
00410 }
00411 globus_i_xio_http_handle_t;
00412 
00418 typedef struct
00419 {
00420     /* attrs for client side */
00421     globus_i_xio_http_request_t         request;
00422     globus_bool_t                       delay_write_header;
00423 
00424     /* only one attr for server side for now*/
00425     globus_i_xio_http_response_t        response;
00426 }
00427 globus_i_xio_http_attr_t;
00428 
00429 /* globus_xio_http.c */
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 /* globus_xio_http_attr.c */
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 /* globus_xio_http_client.c */
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 /* globus_xio_http_handle.c */
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 /* globus_xio_http_header.c */
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 /* globus_xio_http_header_info.c */
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 /* globus_xio_http_rfc2616.c */
00575 extern
00576 const char *
00577 globus_i_xio_http_lookup_reason(
00578     int                                 code);
00579 
00580 /* globus_xio_http_target.c */
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 /* globus_xio_http_request_t */
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 /* globus_xio_http_response.c */
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 /* globus_xio_http_server.c */
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 /* globus_xio_http_target.c */ 
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 /* globus_xio_http_transform.c */
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 /* GLOBUS_I_XIO_HTTP_H */
00839 
00840 #endif /* GLOBUS_DONT_DOCUMENT_INTERNAL */

Generated on 2 May 2016 for globus_xio by  doxygen 1.4.7