globus_xio  6.3
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
globus_i_xio_http.h
1 
2 #ifndef GLOBUS_DONT_DOCUMENT_INTERNAL
3 
9 #ifndef GLOBUS_I_XIO_HTTP_H
10 #define GLOBUS_I_XIO_HTTP_H 1
11 
12 #include "globus_xio.h"
13 #include "globus_xio_driver.h"
14 #include "globus_xio_http.h"
15 
16 enum { GLOBUS_XIO_HTTP_CHUNK_SIZE = 4000 };
17 
18 typedef enum
19 {
20  GLOBUS_XIO_HTTP_TRANSFER_ENCODING_DEFAULT,
21  GLOBUS_XIO_HTTP_TRANSFER_ENCODING_IDENTITY,
22  GLOBUS_XIO_HTTP_TRANSFER_ENCODING_CHUNKED
23 }
24 globus_i_xio_http_transfer_encoding_t;
25 
26 typedef enum
27 {
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,
37  GLOBUS_XIO_HTTP_EOF,
38  GLOBUS_XIO_HTTP_CLOSE
39 }
40 globus_i_xio_http_parse_state_t;
41 
42 typedef struct
43 {
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;
48 }
49 globus_i_xio_http_cancellation_t;
50 
51 #define GLOBUS_XIO_HTTP_COPY_BLOB(fifo, blob, len, label) \
52  do { \
53  result = globus_i_xio_http_copy_blob(fifo, blob, len); \
54  if (result != GLOBUS_SUCCESS) \
55  { \
56  goto label; \
57  } \
58  } while (0);
59 
60 typedef struct
61 {
65  globus_xio_iovec_t * iov;
69  globus_size_t iovcnt;
73  globus_xio_operation_t operation;
77  globus_xio_driver_handle_t driver_handle;
82  globus_size_t nbytes;
86  int wait_for;
90  globus_byte_t chunk_size_buffer[64];
91 }
92 globus_i_xio_http_operation_info_t;
93 
94 #define GLOBUS_XIO_ARRAY_LENGTH(x) (sizeof(x)/sizeof(x[0]))
95 
96 #if BUILD_DEBUG
97 #define GLOBUS_XIO_HTTP_TODO(msg) \
98  do { \
99  globus_libc_fprintf(stderr, "TODO: %s\n", msg); \
100  } while (0);
101 #else
102 #define GLOBUS_XIO_HTTP_TODO(msg) \
103  do { \
104  globus_libc_fprintf(stderr, "TODO: %s\n", msg); \
105  abort(); \
106  } while (0);
107 #endif
108 
112 typedef struct
113 {
118  globus_bool_t is_client;
122  char * host;
123 
127  unsigned short port;
131  char * uri;
132 }
133 globus_i_xio_http_target_t;
134 
135 
136 typedef enum
137 {
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
155 }
156 globus_i_xio_http_header_flags_t;
157 
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)
166 
171 typedef struct
172 {
180  globus_hashtable_t headers;
184  globus_off_t content_length;
188  globus_i_xio_http_transfer_encoding_t
189  transfer_encoding;
193  globus_i_xio_http_header_flags_t flags;
194 }
195 globus_i_xio_http_header_info_t;
196 
203 typedef struct
204 {
213  char * uri;
221  char * method;
229  globus_xio_http_version_t http_version;
233  globus_i_xio_http_header_info_t headers;
234 }
235 globus_i_xio_http_request_t;
236 
243 typedef struct
244 {
250  int status_code;
257  char * reason_phrase;
265  globus_xio_http_version_t http_version;
269  globus_i_xio_http_header_info_t headers;
270 }
271 globus_i_xio_http_response_t;
272 
273 typedef struct globus_i_xio_http_handle_s
274 {
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;
292 
296  globus_xio_iovec_t * header_iovec;
300  int header_iovcnt;
301 
305  globus_xio_iovec_t read_buffer;
306 
311  globus_xio_iovec_t read_iovec;
312 
316  globus_size_t read_buffer_offset;
317 
322  globus_size_t read_buffer_valid;
323 
327  globus_xio_operation_t close_operation;
328 
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;
359 
360 
361  globus_i_xio_http_operation_info_t read_operation;
362  globus_i_xio_http_operation_info_t write_operation;
363 
367  globus_bool_t user_close;
368 
373  globus_bool_t read_response;
374 
378  globus_mutex_t mutex;
379 
383  globus_i_xio_http_cancellation_t * cancellation;
389  globus_bool_t reopen_in_progress;
390 
391  /* error from internal response read, usually with a broken persistent
392  * connection
393  */
394  globus_object_t * pending_error;
395 }
396 globus_i_xio_http_handle_t;
397 
403 typedef struct
404 {
405  /* attrs for client side */
406  globus_i_xio_http_request_t request;
407  globus_bool_t delay_write_header;
408 
409  /* only one attr for server side for now*/
410  globus_i_xio_http_response_t response;
411 }
412 globus_i_xio_http_attr_t;
413 
414 /* globus_xio_http.c */
415 extern
416 globus_result_t
417 globus_i_xio_http_copy_blob(
418  globus_fifo_t * fifo,
419  const char * blob,
420  size_t len);
421 
422 extern
423 char *
424 globus_i_xio_http_find_eol(
425  const char * blob,
426  globus_size_t blob_length);
427 
428 extern
429 globus_bool_t
430 globus_i_xio_http_method_requires_entity(
431  const char * method);
432 
433 extern
435 globus_i_xio_http_guess_version(
436  int major_version,
437  int minor_version);
438 
439 extern
440 globus_result_t
441 globus_i_xio_http_clean_read_buffer(
442  globus_i_xio_http_handle_t * http_handle);
443 
444 /* globus_xio_http_attr.c */
445 extern
446 globus_result_t
447 globus_i_xio_http_attr_init(
448  void ** out_attr);
449 
450 extern
451 globus_result_t
452 globus_i_xio_http_attr_cntl(
453  void * driver_attr,
454  int cmd,
455  va_list ap);
456 
457 extern
458 globus_result_t
459 globus_i_xio_http_attr_copy(
460  void ** dst,
461  void * src);
462 
463 extern
464 globus_result_t
465 globus_i_xio_http_attr_destroy(
466  void * driver_attr);
467 
468 /* globus_xio_http_client.c */
469 extern
470 globus_result_t
471 globus_i_xio_http_client_write_request(
472  globus_xio_operation_t op,
473  globus_i_xio_http_handle_t * http_handle);
474 
475 extern
476 void
477 globus_i_xio_http_client_open_callback(
478  globus_xio_operation_t op,
479  globus_result_t result,
480  void * user_arg);
481 
482 /* globus_xio_http_handle.c */
483 extern
484 globus_result_t
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);
489 
490 extern
491 globus_result_t
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);
496 
497 extern
498 void
499 globus_i_xio_http_handle_destroy(
500  globus_i_xio_http_handle_t * http_handle);
501 
502 extern
503 globus_result_t
504 globus_i_xio_http_handle_cntl(
505  void * handle,
506  int cmd,
507  va_list ap);
508 
509 extern
510 globus_result_t
511 globus_i_xio_http_set_end_of_entity(
512  globus_i_xio_http_handle_t * http_handle);
513 
514 /* globus_xio_http_header.c */
515 extern
516 void
517 globus_i_xio_http_header_copy(
518  void ** dest_key,
519  void ** dest_datum,
520  void * src_key,
521  void * src_datum);
522 
523 extern
524 void
525 globus_i_xio_http_header_destroy(
526  void * header);
527 
528 extern
529 globus_result_t
530 globus_i_xio_http_header_parse(
531  globus_i_xio_http_handle_t * handle,
532  globus_bool_t * done);
533 
534 /* globus_xio_http_header_info.c */
535 extern
536 globus_result_t
537 globus_i_xio_http_header_info_init(
538  globus_i_xio_http_header_info_t * headers);
539 
540 extern
541 void
542 globus_i_xio_http_header_info_destroy(
543  globus_i_xio_http_header_info_t * headers);
544 
545 extern
546 globus_result_t
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 *
550  src);
551 extern
552 globus_result_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);
558 
559 /* globus_xio_http_rfc2616.c */
560 extern
561 const char *
562 globus_i_xio_http_lookup_reason(
563  int code);
564 
565 /* globus_xio_http_target.c */
566 extern
567 globus_i_xio_http_target_t *
568 globus_i_xio_http_target_new(void);
569 
570 extern
571 globus_result_t
572 globus_i_xio_http_target_destroy(
573  void * driver_target);
574 
575 extern
576 void
577 globus_i_xio_http_target_destroy_internal(
578  globus_i_xio_http_target_t * target);
579 
580 /* globus_xio_http_request_t */
581 extern
582 globus_result_t
583 globus_i_xio_http_request_init(
584  globus_i_xio_http_request_t * request);
585 
586 extern
587 globus_result_t
588 globus_i_xio_http_request_copy(
589  globus_i_xio_http_request_t * dest,
590  const globus_i_xio_http_request_t * src);
591 
592 extern
593 void
594 globus_i_xio_http_request_destroy(
595  globus_i_xio_http_request_t * request);
596 
597 /* globus_xio_http_response.c */
598 extern
599 globus_result_t
600 globus_i_xio_http_response_init(
601  globus_i_xio_http_response_t * response);
602 
603 extern
604 globus_result_t
605 globus_i_xio_http_response_copy(
606  globus_i_xio_http_response_t * dest,
607  const globus_i_xio_http_response_t *src);
608 
609 extern
610 void
611 globus_i_xio_http_response_destroy(
612  globus_i_xio_http_response_t * response);
613 
614 
615 /* globus_xio_http_server.c */
616 extern
617 void
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,
622  void * user_arg);
623 
624 extern
625 globus_result_t
626 globus_i_xio_http_accept(
627  void * driver_server,
628  globus_xio_operation_t accept_op);
629 
630 extern
631 void
632 globus_i_xio_http_server_open_callback(
633  globus_xio_operation_t op,
634  globus_result_t result,
635  void * user_arg);
636 
637 extern
638 globus_result_t
639 globus_i_xio_http_server_write_response(
640  globus_i_xio_http_handle_t * http_handle,
641  const globus_xio_iovec_t * iovec,
642  int iovec_count,
643  globus_xio_operation_t op);
644 
645 extern
646 globus_result_t
647 globus_i_xio_http_server_read_next_request(
648  globus_i_xio_http_handle_t * http_handle);
649 
650 /* globus_xio_http_target.c */
651 extern
652 globus_result_t
653 globus_i_xio_http_target_init(
654  globus_i_xio_http_target_t ** out_target,
655  const globus_xio_contact_t * contact_info);
656 
657 extern
658 globus_result_t
659 globus_i_xio_http_target_copy(
660  globus_i_xio_http_target_t * dest,
661  const globus_i_xio_http_target_t * src);
662 
663 /* globus_xio_http_transform.c */
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;
668 
669 extern
670 globus_result_t
671 globus_i_xio_http_open(
672  const globus_xio_contact_t * contact_info,
673  void * link,
674  void * attr,
675  globus_xio_operation_t op);
676 
677 extern
678 globus_result_t
679 globus_i_xio_http_read(
680  void * handle,
681  const globus_xio_iovec_t * iovec,
682  int iovec_count,
683  globus_xio_operation_t op);
684 
685 extern
686 globus_result_t
687 globus_i_xio_http_write(
688  void * handle,
689  const globus_xio_iovec_t * iovec,
690  int iovec_count,
691  globus_xio_operation_t op);
692 
693 
694 extern
695 globus_result_t
696 globus_l_xio_http_client_parse_response(
697  globus_i_xio_http_handle_t * http_handle,
698  globus_bool_t * done);
699 
700 void
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,
705  void * user_arg);
706 
707 extern
708 globus_result_t
709 globus_i_xio_http_parse_residue(
710  globus_i_xio_http_handle_t * handle,
711  globus_bool_t * registered_again);
712 
713 extern
714 globus_result_t
715 globus_i_xio_http_write_chunk(
716  globus_i_xio_http_handle_t * http_handle,
717  const globus_xio_iovec_t * iovec,
718  int iovec_count,
719  globus_xio_operation_t op);
720 
721 extern
722 void
723 globus_i_xio_http_write_callback(
724  globus_xio_operation_t op,
725  globus_result_t result,
726  globus_size_t nbytes,
727  void * user_arg);
728 
729 extern
730 globus_result_t
731 globus_i_xio_http_close(
732  void * handle,
733  void * attr,
734  globus_xio_operation_t op);
735 
736 extern
737 globus_result_t
738 globus_i_xio_http_close_internal(
739  globus_i_xio_http_handle_t * http_handle);
740 
741 extern
742 void
743 globus_i_xio_http_close_callback(
744  globus_xio_operation_t operation,
745  globus_result_t result,
746  void * handle);
747 
748 GlobusXIODeclareModule(http);
749 #define GLOBUS_XIO_HTTP_MODULE GlobusXIOMyModule(http)
750 
751 #define GlobusXIOHttpErrorObjParse(token, context) \
752  globus_error_construct_error( \
753  GLOBUS_XIO_HTTP_MODULE, \
754  GLOBUS_NULL, \
755  GLOBUS_XIO_HTTP_ERROR_PARSE, \
756  __FILE__, \
757  _xio_name, \
758  __LINE__, \
759  "Error parsing %s token at %s", \
760  token, context)
761 
762 #define GlobusXIOHttpErrorParse(token, context) \
763  globus_error_put( \
764  GlobusXIOHttpErrorObjParse(token, context))
765 
766 #define GlobusXIOHttpErrorObjInvalidHeader(name, value) \
767  globus_error_construct_error( \
768  GLOBUS_XIO_HTTP_MODULE, \
769  GLOBUS_NULL, \
770  GLOBUS_XIO_HTTP_ERROR_INVALID_HEADER, \
771  __FILE__, \
772  _xio_name, \
773  __LINE__, \
774  "Invalid %s header value %s", \
775  name, value)
776 
777 #define GlobusXIOHttpErrorInvalidHeader(name, value) \
778  globus_error_put( \
779  GlobusXIOHttpErrorObjInvalidHeader(name, value))
780 
781 #define GlobusXIOHttpErrorObjNoEntity() \
782  globus_error_construct_error( \
783  GLOBUS_XIO_HTTP_MODULE, \
784  GLOBUS_NULL, \
785  GLOBUS_XIO_HTTP_ERROR_NO_ENTITY, \
786  __FILE__, \
787  _xio_name, \
788  __LINE__, \
789  "No entity to read or write")
790 
791 #define GlobusXIOHttpErrorNoEntity() \
792  globus_error_put( \
793  GlobusXIOHttpErrorObjNoEntity())
794 
795 #define GlobusXIOHttpErrorObjEOF() \
796  globus_error_construct_error( \
797  GLOBUS_XIO_HTTP_MODULE, \
798  GLOBUS_NULL, \
799  GLOBUS_XIO_HTTP_ERROR_EOF, \
800  __FILE__, \
801  _xio_name, \
802  __LINE__, \
803  "End of Entity")
804 
805 #define GlobusXIOHttpErrorEOF() \
806  globus_error_put( \
807  GlobusXIOHttpErrorObjEOF())
808 
809 #define GlobusXIOHttpErrorPersistentConnectionDropped(cause) \
810  globus_error_put( \
811  GlobusXIOHTTPErrorObjPersistentConnectionDropped(cause))
812 
813 #define GlobusXIOHTTPErrorObjPersistentConnectionDropped(cause) \
814  globus_error_construct_error( \
815  GLOBUS_XIO_HTTP_MODULE, \
816  cause, \
817  GLOBUS_XIO_HTTP_ERROR_PERSISTENT_CONNECTION_DROPPED, \
818  __FILE__, \
819  _xio_name, \
820  __LINE__, \
821  "Persistent connection dropped")
822 
823 #endif /* GLOBUS_I_XIO_HTTP_H */
824 
825 #endif /* GLOBUS_DONT_DOCUMENT_INTERNAL */
Globus XIO HTTP Driver Header.
globus_xio_http_version_t
Definition: globus_xio_http.h:209