Grid Community Toolkit  6.2.1705709074 (tag: v6.2.20240202)
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
globus_i_xio_http.h
1 /*
2  * Copyright 1999-2006 University of Chicago
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef GLOBUS_DONT_DOCUMENT_INTERNAL
18 
24 #ifndef GLOBUS_I_XIO_HTTP_H
25 #define GLOBUS_I_XIO_HTTP_H 1
26 
27 #include "globus_xio.h"
28 #include "globus_xio_driver.h"
29 #include "globus_xio_http.h"
30 
31 enum { GLOBUS_XIO_HTTP_CHUNK_SIZE = 4000 };
32 
33 typedef enum
34 {
35  GLOBUS_XIO_HTTP_TRANSFER_ENCODING_DEFAULT,
36  GLOBUS_XIO_HTTP_TRANSFER_ENCODING_IDENTITY,
37  GLOBUS_XIO_HTTP_TRANSFER_ENCODING_CHUNKED
38 }
39 globus_i_xio_http_transfer_encoding_t;
40 
41 typedef enum
42 {
43  GLOBUS_XIO_HTTP_PRE_REQUEST_LINE,
44  GLOBUS_XIO_HTTP_REQUEST_LINE,
45  GLOBUS_XIO_HTTP_STATUS_LINE,
46  GLOBUS_XIO_HTTP_HEADERS,
47  GLOBUS_XIO_HTTP_CHUNK_CRLF,
48  GLOBUS_XIO_HTTP_CHUNK_LINE,
49  GLOBUS_XIO_HTTP_CHUNK_FOOTERS,
50  GLOBUS_XIO_HTTP_CHUNK_BODY,
51  GLOBUS_XIO_HTTP_IDENTITY_BODY,
52  GLOBUS_XIO_HTTP_EOF,
53  GLOBUS_XIO_HTTP_CLOSE
54 }
55 globus_i_xio_http_parse_state_t;
56 
57 typedef struct
58 {
59  struct globus_i_xio_http_handle_s * http_handle;
60  globus_xio_operation_t user_read_op;
61  globus_xio_operation_t internal_op;
62  globus_xio_driver_handle_t driver_handle;
63 }
64 globus_i_xio_http_cancellation_t;
65 
66 #define GLOBUS_XIO_HTTP_COPY_BLOB(fifo, blob, len, label) \
67  do { \
68  result = globus_i_xio_http_copy_blob(fifo, blob, len); \
69  if (result != GLOBUS_SUCCESS) \
70  { \
71  goto label; \
72  } \
73  } while (0);
74 
75 typedef struct
76 {
80  globus_xio_iovec_t * iov;
84  globus_size_t iovcnt;
88  globus_xio_operation_t operation;
92  globus_xio_driver_handle_t driver_handle;
97  globus_size_t nbytes;
101  int wait_for;
105  globus_byte_t chunk_size_buffer[64];
106 }
107 globus_i_xio_http_operation_info_t;
108 
109 #define GLOBUS_XIO_ARRAY_LENGTH(x) (sizeof(x)/sizeof(x[0]))
110 
111 #if BUILD_DEBUG
112 #define GLOBUS_XIO_HTTP_TODO(msg) \
113  do { \
114  globus_libc_fprintf(stderr, "TODO: %s\n", msg); \
115  } while (0);
116 #else
117 #define GLOBUS_XIO_HTTP_TODO(msg) \
118  do { \
119  globus_libc_fprintf(stderr, "TODO: %s\n", msg); \
120  abort(); \
121  } while (0);
122 #endif
123 
127 typedef struct
128 {
133  globus_bool_t is_client;
137  char * host;
138 
142  unsigned short port;
146  char * uri;
147 }
148 globus_i_xio_http_target_t;
149 
150 
151 typedef enum
152 {
161  GLOBUS_I_XIO_HTTP_HEADER_ENTITY_NEEDED = 1 << 0,
165  GLOBUS_I_XIO_HTTP_HEADER_CONTENT_LENGTH_SET = 1 << 1,
169  GLOBUS_I_XIO_HTTP_HEADER_CONNECTION_CLOSE = 1 << 2
170 }
171 globus_i_xio_http_header_flags_t;
172 
175 #define GLOBUS_I_XIO_HTTP_HEADER_IS_ENTITY_NEEDED(header) \
176  ((header)->flags & GLOBUS_I_XIO_HTTP_HEADER_ENTITY_NEEDED)
177 #define GLOBUS_I_XIO_HTTP_HEADER_IS_CONTENT_LENGTH_SET(header) \
178  ((header)->flags & GLOBUS_I_XIO_HTTP_HEADER_CONTENT_LENGTH_SET)
179 #define GLOBUS_I_XIO_HTTP_HEADER_IS_CONNECTION_CLOSE(header) \
180  ((header)->flags & GLOBUS_I_XIO_HTTP_HEADER_CONNECTION_CLOSE)
181 
186 typedef struct
187 {
195  globus_hashtable_t headers;
199  globus_off_t content_length;
203  globus_i_xio_http_transfer_encoding_t
204  transfer_encoding;
208  globus_i_xio_http_header_flags_t flags;
209 }
210 globus_i_xio_http_header_info_t;
211 
218 typedef struct
219 {
228  char * uri;
236  char * method;
244  globus_xio_http_version_t http_version;
248  globus_i_xio_http_header_info_t headers;
249 }
250 globus_i_xio_http_request_t;
251 
258 typedef struct
259 {
265  int status_code;
272  char * reason_phrase;
280  globus_xio_http_version_t http_version;
284  globus_i_xio_http_header_info_t headers;
285 }
286 globus_i_xio_http_response_t;
287 
288 typedef struct globus_i_xio_http_handle_s
289 {
293  globus_i_xio_http_target_t target_info;
297  globus_i_xio_http_request_t request_info;
302  globus_i_xio_http_response_t response_info;
306  globus_xio_driver_handle_t handle;
307 
311  globus_xio_iovec_t * header_iovec;
315  int header_iovcnt;
316 
320  globus_xio_iovec_t read_buffer;
321 
326  globus_xio_iovec_t read_iovec;
327 
331  globus_size_t read_buffer_offset;
332 
337  globus_size_t read_buffer_valid;
338 
342  globus_xio_operation_t close_operation;
343 
347  globus_size_t read_chunk_left;
351  globus_bool_t delay_write_header;
355  const globus_xio_iovec_t * first_write_iovec;
359  int first_write_iovec_count;
363  globus_i_xio_http_parse_state_t parse_state;
367  globus_i_xio_http_parse_state_t send_state;
373  globus_xio_operation_t response_read_operation;
374 
375 
376  globus_i_xio_http_operation_info_t read_operation;
377  globus_i_xio_http_operation_info_t write_operation;
378 
382  globus_bool_t user_close;
383 
388  globus_bool_t read_response;
389 
393  globus_mutex_t mutex;
394 
398  globus_i_xio_http_cancellation_t * cancellation;
404  globus_bool_t reopen_in_progress;
405 
406  /* error from internal response read, usually with a broken persistent
407  * connection
408  */
409  globus_object_t * pending_error;
410 }
411 globus_i_xio_http_handle_t;
412 
418 typedef struct
419 {
420  /* attrs for client side */
421  globus_i_xio_http_request_t request;
422  globus_bool_t delay_write_header;
423 
424  /* only one attr for server side for now*/
425  globus_i_xio_http_response_t response;
426 }
427 globus_i_xio_http_attr_t;
428 
429 /* globus_xio_http.c */
430 extern
432 globus_i_xio_http_copy_blob(
433  globus_fifo_t * fifo,
434  const char * blob,
435  size_t len);
436 
437 extern
438 char *
439 globus_i_xio_http_find_eol(
440  const char * blob,
441  globus_size_t blob_length);
442 
443 extern
445 globus_i_xio_http_method_requires_entity(
446  const char * method);
447 
448 extern
450 globus_i_xio_http_guess_version(
451  int major_version,
452  int minor_version);
453 
454 extern
456 globus_i_xio_http_clean_read_buffer(
457  globus_i_xio_http_handle_t * http_handle);
458 
459 /* globus_xio_http_attr.c */
460 extern
462 globus_i_xio_http_attr_init(
463  void ** out_attr);
464 
465 extern
467 globus_i_xio_http_attr_cntl(
468  void * driver_attr,
469  int cmd,
470  va_list ap);
471 
472 extern
474 globus_i_xio_http_attr_copy(
475  void ** dst,
476  void * src);
477 
478 extern
480 globus_i_xio_http_attr_destroy(
481  void * driver_attr);
482 
483 /* globus_xio_http_client.c */
484 extern
486 globus_i_xio_http_client_write_request(
487  globus_xio_operation_t op,
488  globus_i_xio_http_handle_t * http_handle);
489 
490 extern
491 void
492 globus_i_xio_http_client_open_callback(
493  globus_xio_operation_t op,
494  globus_result_t result,
495  void * user_arg);
496 
497 /* globus_xio_http_handle.c */
498 extern
500 globus_i_xio_http_handle_init(
501  globus_i_xio_http_handle_t * http_handle,
502  globus_i_xio_http_attr_t * attr,
503  globus_i_xio_http_target_t * target);
504 
505 extern
507 globus_i_xio_http_handle_reinit(
508  globus_i_xio_http_handle_t * http_handle,
509  globus_i_xio_http_attr_t * http_attr,
510  globus_i_xio_http_target_t * http_target);
511 
512 extern
513 void
514 globus_i_xio_http_handle_destroy(
515  globus_i_xio_http_handle_t * http_handle);
516 
517 extern
519 globus_i_xio_http_handle_cntl(
520  void * handle,
521  int cmd,
522  va_list ap);
523 
524 extern
526 globus_i_xio_http_set_end_of_entity(
527  globus_i_xio_http_handle_t * http_handle);
528 
529 /* globus_xio_http_header.c */
530 extern
531 void
532 globus_i_xio_http_header_copy(
533  void ** dest_key,
534  void ** dest_datum,
535  void * src_key,
536  void * src_datum);
537 
538 extern
539 void
540 globus_i_xio_http_header_destroy(
541  void * header);
542 
543 extern
545 globus_i_xio_http_header_parse(
546  globus_i_xio_http_handle_t * handle,
547  globus_bool_t * done);
548 
549 /* globus_xio_http_header_info.c */
550 extern
552 globus_i_xio_http_header_info_init(
553  globus_i_xio_http_header_info_t * headers);
554 
555 extern
556 void
557 globus_i_xio_http_header_info_destroy(
558  globus_i_xio_http_header_info_t * headers);
559 
560 extern
562 globus_i_xio_http_header_info_copy(
563  globus_i_xio_http_header_info_t * dest,
564  const globus_i_xio_http_header_info_t *
565  src);
566 extern
568 globus_i_xio_http_header_info_set_header(
569  globus_i_xio_http_header_info_t * headers,
570  const char * header_name,
571  const char * header_value,
572  globus_bool_t store_all);
573 
574 /* globus_xio_http_rfc2616.c */
575 extern
576 const char *
577 globus_i_xio_http_lookup_reason(
578  int code);
579 
580 /* globus_xio_http_target.c */
581 extern
582 globus_i_xio_http_target_t *
583 globus_i_xio_http_target_new(void);
584 
585 extern
587 globus_i_xio_http_target_destroy(
588  void * driver_target);
589 
590 extern
591 void
592 globus_i_xio_http_target_destroy_internal(
593  globus_i_xio_http_target_t * target);
594 
595 /* globus_xio_http_request_t */
596 extern
598 globus_i_xio_http_request_init(
599  globus_i_xio_http_request_t * request);
600 
601 extern
603 globus_i_xio_http_request_copy(
604  globus_i_xio_http_request_t * dest,
605  const globus_i_xio_http_request_t * src);
606 
607 extern
608 void
609 globus_i_xio_http_request_destroy(
610  globus_i_xio_http_request_t * request);
611 
612 /* globus_xio_http_response.c */
613 extern
615 globus_i_xio_http_response_init(
616  globus_i_xio_http_response_t * response);
617 
618 extern
620 globus_i_xio_http_response_copy(
621  globus_i_xio_http_response_t * dest,
622  const globus_i_xio_http_response_t *src);
623 
624 extern
625 void
626 globus_i_xio_http_response_destroy(
627  globus_i_xio_http_response_t * response);
628 
629 
630 /* globus_xio_http_server.c */
631 extern
632 void
633 globus_i_xio_http_server_read_request_callback(
634  globus_xio_operation_t op,
635  globus_result_t result,
636  globus_size_t nbytes,
637  void * user_arg);
638 
639 extern
641 globus_i_xio_http_accept(
642  void * driver_server,
643  globus_xio_operation_t accept_op);
644 
645 extern
646 void
647 globus_i_xio_http_server_open_callback(
648  globus_xio_operation_t op,
649  globus_result_t result,
650  void * user_arg);
651 
652 extern
654 globus_i_xio_http_server_write_response(
655  globus_i_xio_http_handle_t * http_handle,
656  const globus_xio_iovec_t * iovec,
657  int iovec_count,
658  globus_xio_operation_t op);
659 
660 extern
662 globus_i_xio_http_server_read_next_request(
663  globus_i_xio_http_handle_t * http_handle);
664 
665 /* globus_xio_http_target.c */
666 extern
668 globus_i_xio_http_target_init(
669  globus_i_xio_http_target_t ** out_target,
670  const globus_xio_contact_t * contact_info);
671 
672 extern
674 globus_i_xio_http_target_copy(
675  globus_i_xio_http_target_t * dest,
676  const globus_i_xio_http_target_t * src);
677 
678 /* globus_xio_http_transform.c */
679 extern globus_list_t * globus_i_xio_http_cached_handles;
680 extern globus_mutex_t globus_i_xio_http_cached_handle_mutex;
681 extern globus_list_t * globus_i_xio_http_cancellable_handles;
682 extern globus_mutex_t globus_i_xio_http_cancel_mutex;
683 
684 extern
686 globus_i_xio_http_open(
687  const globus_xio_contact_t * contact_info,
688  void * link,
689  void * attr,
690  globus_xio_operation_t op);
691 
692 extern
694 globus_i_xio_http_read(
695  void * handle,
696  const globus_xio_iovec_t * iovec,
697  int iovec_count,
698  globus_xio_operation_t op);
699 
700 extern
702 globus_i_xio_http_write(
703  void * handle,
704  const globus_xio_iovec_t * iovec,
705  int iovec_count,
706  globus_xio_operation_t op);
707 
708 
709 extern
711 globus_l_xio_http_client_parse_response(
712  globus_i_xio_http_handle_t * http_handle,
713  globus_bool_t * done);
714 
715 void
716 globus_l_xio_http_client_read_response_callback(
717  globus_xio_operation_t op,
718  globus_result_t result,
719  globus_size_t nbytes,
720  void * user_arg);
721 
722 extern
724 globus_i_xio_http_parse_residue(
725  globus_i_xio_http_handle_t * handle,
726  globus_bool_t * registered_again);
727 
728 extern
730 globus_i_xio_http_write_chunk(
731  globus_i_xio_http_handle_t * http_handle,
732  const globus_xio_iovec_t * iovec,
733  int iovec_count,
734  globus_xio_operation_t op);
735 
736 extern
737 void
738 globus_i_xio_http_write_callback(
739  globus_xio_operation_t op,
740  globus_result_t result,
741  globus_size_t nbytes,
742  void * user_arg);
743 
744 extern
746 globus_i_xio_http_close(
747  void * handle,
748  void * attr,
749  globus_xio_operation_t op);
750 
751 extern
753 globus_i_xio_http_close_internal(
754  globus_i_xio_http_handle_t * http_handle);
755 
756 extern
757 void
758 globus_i_xio_http_close_callback(
759  globus_xio_operation_t operation,
760  globus_result_t result,
761  void * handle);
762 
763 GlobusXIODeclareModule(http);
764 #define GLOBUS_XIO_HTTP_MODULE GlobusXIOMyModule(http)
765 
766 #define GlobusXIOHttpErrorObjParse(token, context) \
767  globus_error_construct_error( \
768  GLOBUS_XIO_HTTP_MODULE, \
769  GLOBUS_NULL, \
770  GLOBUS_XIO_HTTP_ERROR_PARSE, \
771  __FILE__, \
772  _xio_name, \
773  __LINE__, \
774  "Error parsing %s token at %s", \
775  token, context)
776 
777 #define GlobusXIOHttpErrorParse(token, context) \
778  globus_error_put( \
779  GlobusXIOHttpErrorObjParse(token, context))
780 
781 #define GlobusXIOHttpErrorObjInvalidHeader(name, value) \
782  globus_error_construct_error( \
783  GLOBUS_XIO_HTTP_MODULE, \
784  GLOBUS_NULL, \
785  GLOBUS_XIO_HTTP_ERROR_INVALID_HEADER, \
786  __FILE__, \
787  _xio_name, \
788  __LINE__, \
789  "Invalid %s header value %s", \
790  name, value)
791 
792 #define GlobusXIOHttpErrorInvalidHeader(name, value) \
793  globus_error_put( \
794  GlobusXIOHttpErrorObjInvalidHeader(name, value))
795 
796 #define GlobusXIOHttpErrorObjNoEntity() \
797  globus_error_construct_error( \
798  GLOBUS_XIO_HTTP_MODULE, \
799  GLOBUS_NULL, \
800  GLOBUS_XIO_HTTP_ERROR_NO_ENTITY, \
801  __FILE__, \
802  _xio_name, \
803  __LINE__, \
804  "No entity to read or write")
805 
806 #define GlobusXIOHttpErrorNoEntity() \
807  globus_error_put( \
808  GlobusXIOHttpErrorObjNoEntity())
809 
810 #define GlobusXIOHttpErrorObjEOF() \
811  globus_error_construct_error( \
812  GLOBUS_XIO_HTTP_MODULE, \
813  GLOBUS_NULL, \
814  GLOBUS_XIO_HTTP_ERROR_EOF, \
815  __FILE__, \
816  _xio_name, \
817  __LINE__, \
818  "End of Entity")
819 
820 #define GlobusXIOHttpErrorEOF() \
821  globus_error_put( \
822  GlobusXIOHttpErrorObjEOF())
823 
824 #define GlobusXIOHttpErrorPersistentConnectionDropped(cause) \
825  globus_error_put( \
826  GlobusXIOHTTPErrorObjPersistentConnectionDropped(cause))
827 
828 #define GlobusXIOHTTPErrorObjPersistentConnectionDropped(cause) \
829  globus_error_construct_error( \
830  GLOBUS_XIO_HTTP_MODULE, \
831  cause, \
832  GLOBUS_XIO_HTTP_ERROR_PERSISTENT_CONNECTION_DROPPED, \
833  __FILE__, \
834  _xio_name, \
835  __LINE__, \
836  "Persistent connection dropped")
837 
838 #endif /* GLOBUS_I_XIO_HTTP_H */
839 
840 #endif /* GLOBUS_DONT_DOCUMENT_INTERNAL */
int globus_bool_t
Boolean type.
Definition: globus_types.h:93
struct globus_fifo_s * globus_fifo_t
Definition: globus_fifo.h:48
List data type.
Definition: globus_list.h:44
Globus XIO HTTP Driver Header.
Mutex.
Definition: globus_thread.h:107
size_t globus_size_t
Standard size of memory objectThe globus_size_t is the size of a memory object. It is identical to si...
Definition: globus_types.h:48
unsigned char globus_byte_t
Unsigned byte datatypeThis is used for byte-addressable arrays of arbitrary data which is not subject...
Definition: globus_types.h:85
uint32_t globus_result_t
Definition: globus_types.h:99
globus_xio_http_version_t
Definition: globus_xio_http.h:231