globus_xio 6.6
Loading...
Searching...
No Matches
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
31enum { GLOBUS_XIO_HTTP_CHUNK_SIZE = 4000 };
32
33typedef enum
34{
35 GLOBUS_XIO_HTTP_TRANSFER_ENCODING_DEFAULT,
36 GLOBUS_XIO_HTTP_TRANSFER_ENCODING_IDENTITY,
37 GLOBUS_XIO_HTTP_TRANSFER_ENCODING_CHUNKED
38}
39globus_i_xio_http_transfer_encoding_t;
40
41typedef 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}
55globus_i_xio_http_parse_state_t;
56
57typedef 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}
64globus_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
75typedef 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}
107globus_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
127typedef struct
128{
133 globus_bool_t is_client;
137 char * host;
138
142 unsigned short port;
146 char * uri;
147}
148globus_i_xio_http_target_t;
149
150
151typedef 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}
171globus_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)
186typedef 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}
210globus_i_xio_http_header_info_t;
211
218typedef 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}
250globus_i_xio_http_request_t;
251
258typedef 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}
286globus_i_xio_http_response_t;
287
288typedef 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}
411globus_i_xio_http_handle_t;
412
418typedef 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}
427globus_i_xio_http_attr_t;
428
429/* globus_xio_http.c */
430extern
431globus_result_t
432globus_i_xio_http_copy_blob(
433 globus_fifo_t * fifo,
434 const char * blob,
435 size_t len);
436
437extern
438char *
439globus_i_xio_http_find_eol(
440 const char * blob,
441 globus_size_t blob_length);
442
443extern
444globus_bool_t
445globus_i_xio_http_method_requires_entity(
446 const char * method);
447
448extern
450globus_i_xio_http_guess_version(
451 int major_version,
452 int minor_version);
453
454extern
455globus_result_t
456globus_i_xio_http_clean_read_buffer(
457 globus_i_xio_http_handle_t * http_handle);
458
459/* globus_xio_http_attr.c */
460extern
461globus_result_t
462globus_i_xio_http_attr_init(
463 void ** out_attr);
464
465extern
466globus_result_t
467globus_i_xio_http_attr_cntl(
468 void * driver_attr,
469 int cmd,
470 va_list ap);
471
472extern
473globus_result_t
474globus_i_xio_http_attr_copy(
475 void ** dst,
476 void * src);
477
478extern
479globus_result_t
480globus_i_xio_http_attr_destroy(
481 void * driver_attr);
482
483/* globus_xio_http_client.c */
484extern
485globus_result_t
486globus_i_xio_http_client_write_request(
487 globus_xio_operation_t op,
488 globus_i_xio_http_handle_t * http_handle);
489
490extern
491void
492globus_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 */
498extern
499globus_result_t
500globus_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
505extern
506globus_result_t
507globus_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
512extern
513void
514globus_i_xio_http_handle_destroy(
515 globus_i_xio_http_handle_t * http_handle);
516
517extern
518globus_result_t
519globus_i_xio_http_handle_cntl(
520 void * handle,
521 int cmd,
522 va_list ap);
523
524extern
525globus_result_t
526globus_i_xio_http_set_end_of_entity(
527 globus_i_xio_http_handle_t * http_handle);
528
529/* globus_xio_http_header.c */
530extern
531void
532globus_i_xio_http_header_copy(
533 void ** dest_key,
534 void ** dest_datum,
535 void * src_key,
536 void * src_datum);
537
538extern
539void
540globus_i_xio_http_header_destroy(
541 void * header);
542
543extern
544globus_result_t
545globus_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 */
550extern
551globus_result_t
552globus_i_xio_http_header_info_init(
553 globus_i_xio_http_header_info_t * headers);
554
555extern
556void
557globus_i_xio_http_header_info_destroy(
558 globus_i_xio_http_header_info_t * headers);
559
560extern
561globus_result_t
562globus_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);
566extern
567globus_result_t
568globus_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 */
575extern
576const char *
577globus_i_xio_http_lookup_reason(
578 int code);
579
580/* globus_xio_http_target.c */
581extern
582globus_i_xio_http_target_t *
583globus_i_xio_http_target_new(void);
584
585extern
586globus_result_t
587globus_i_xio_http_target_destroy(
588 void * driver_target);
589
590extern
591void
592globus_i_xio_http_target_destroy_internal(
593 globus_i_xio_http_target_t * target);
594
595/* globus_xio_http_request_t */
596extern
597globus_result_t
598globus_i_xio_http_request_init(
599 globus_i_xio_http_request_t * request);
600
601extern
602globus_result_t
603globus_i_xio_http_request_copy(
604 globus_i_xio_http_request_t * dest,
605 const globus_i_xio_http_request_t * src);
606
607extern
608void
609globus_i_xio_http_request_destroy(
610 globus_i_xio_http_request_t * request);
611
612/* globus_xio_http_response.c */
613extern
614globus_result_t
615globus_i_xio_http_response_init(
616 globus_i_xio_http_response_t * response);
617
618extern
619globus_result_t
620globus_i_xio_http_response_copy(
621 globus_i_xio_http_response_t * dest,
622 const globus_i_xio_http_response_t *src);
623
624extern
625void
626globus_i_xio_http_response_destroy(
627 globus_i_xio_http_response_t * response);
628
629
630/* globus_xio_http_server.c */
631extern
632void
633globus_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
639extern
640globus_result_t
641globus_i_xio_http_accept(
642 void * driver_server,
643 globus_xio_operation_t accept_op);
644
645extern
646void
647globus_i_xio_http_server_open_callback(
648 globus_xio_operation_t op,
649 globus_result_t result,
650 void * user_arg);
651
652extern
653globus_result_t
654globus_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
660extern
661globus_result_t
662globus_i_xio_http_server_read_next_request(
663 globus_i_xio_http_handle_t * http_handle);
664
665/* globus_xio_http_target.c */
666extern
667globus_result_t
668globus_i_xio_http_target_init(
669 globus_i_xio_http_target_t ** out_target,
670 const globus_xio_contact_t * contact_info);
671
672extern
673globus_result_t
674globus_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 */
679extern globus_list_t * globus_i_xio_http_cached_handles;
680extern globus_mutex_t globus_i_xio_http_cached_handle_mutex;
681extern globus_list_t * globus_i_xio_http_cancellable_handles;
682extern globus_mutex_t globus_i_xio_http_cancel_mutex;
683
684extern
685globus_result_t
686globus_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
692extern
693globus_result_t
694globus_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
700extern
701globus_result_t
702globus_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
709extern
710globus_result_t
711globus_l_xio_http_client_parse_response(
712 globus_i_xio_http_handle_t * http_handle,
713 globus_bool_t * done);
714
715void
716globus_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
722extern
723globus_result_t
724globus_i_xio_http_parse_residue(
725 globus_i_xio_http_handle_t * handle,
726 globus_bool_t * registered_again);
727
728extern
729globus_result_t
730globus_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
736extern
737void
738globus_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
744extern
745globus_result_t
746globus_i_xio_http_close(
747 void * handle,
748 void * attr,
749 globus_xio_operation_t op);
750
751extern
752globus_result_t
753globus_i_xio_http_close_internal(
754 globus_i_xio_http_handle_t * http_handle);
755
756extern
757void
758globus_i_xio_http_close_callback(
759 globus_xio_operation_t operation,
760 globus_result_t result,
761 void * handle);
762
763GlobusXIODeclareModule(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 */
Globus XIO HTTP Driver Header.
globus_xio_http_version_t
Definition: globus_xio_http.h:232