1*3ff40c12SJohn Marino /* 26d49e1aeSJan Lentfer * httpread - Manage reading file(s) from HTTP/TCP socket 36d49e1aeSJan Lentfer * Author: Ted Merrill 46d49e1aeSJan Lentfer * Copyright 2008 Atheros Communications 56d49e1aeSJan Lentfer * 6*3ff40c12SJohn Marino * This software may be distributed under the terms of the BSD license. 7*3ff40c12SJohn Marino * See README for more details. 86d49e1aeSJan Lentfer */ 96d49e1aeSJan Lentfer 106d49e1aeSJan Lentfer #ifndef HTTPREAD_H 116d49e1aeSJan Lentfer #define HTTPREAD_H 126d49e1aeSJan Lentfer 136d49e1aeSJan Lentfer /* event types (passed to callback) */ 146d49e1aeSJan Lentfer enum httpread_event { 156d49e1aeSJan Lentfer HTTPREAD_EVENT_FILE_READY = 1, /* including reply ready */ 166d49e1aeSJan Lentfer HTTPREAD_EVENT_TIMEOUT = 2, 176d49e1aeSJan Lentfer HTTPREAD_EVENT_ERROR = 3 /* misc. error, esp malloc error */ 186d49e1aeSJan Lentfer }; 196d49e1aeSJan Lentfer 206d49e1aeSJan Lentfer 216d49e1aeSJan Lentfer /* header type detected 226d49e1aeSJan Lentfer * available to callback via call to httpread_reply_code_get() 236d49e1aeSJan Lentfer */ 246d49e1aeSJan Lentfer enum httpread_hdr_type { 256d49e1aeSJan Lentfer HTTPREAD_HDR_TYPE_UNKNOWN = 0, /* none of the following */ 266d49e1aeSJan Lentfer HTTPREAD_HDR_TYPE_REPLY = 1, /* hdr begins w/ HTTP/ */ 276d49e1aeSJan Lentfer HTTPREAD_HDR_TYPE_GET = 2, /* hdr begins with GET<sp> */ 286d49e1aeSJan Lentfer HTTPREAD_HDR_TYPE_HEAD = 3, /* hdr begins with HEAD<sp> */ 296d49e1aeSJan Lentfer HTTPREAD_HDR_TYPE_POST = 4, /* hdr begins with POST<sp> */ 306d49e1aeSJan Lentfer HTTPREAD_HDR_TYPE_PUT = 5, /* hdr begins with ... */ 316d49e1aeSJan Lentfer HTTPREAD_HDR_TYPE_DELETE = 6, /* hdr begins with ... */ 326d49e1aeSJan Lentfer HTTPREAD_HDR_TYPE_TRACE = 7, /* hdr begins with ... */ 336d49e1aeSJan Lentfer HTTPREAD_HDR_TYPE_CONNECT = 8, /* hdr begins with ... */ 346d49e1aeSJan Lentfer HTTPREAD_HDR_TYPE_NOTIFY = 9, /* hdr begins with ... */ 356d49e1aeSJan Lentfer HTTPREAD_HDR_TYPE_M_SEARCH = 10, /* hdr begins with ... */ 366d49e1aeSJan Lentfer HTTPREAD_HDR_TYPE_M_POST = 11, /* hdr begins with ... */ 376d49e1aeSJan Lentfer HTTPREAD_HDR_TYPE_SUBSCRIBE = 12, /* hdr begins with ... */ 386d49e1aeSJan Lentfer HTTPREAD_HDR_TYPE_UNSUBSCRIBE = 13, /* hdr begins with ... */ 396d49e1aeSJan Lentfer 406d49e1aeSJan Lentfer HTTPREAD_N_HDR_TYPES /* keep last */ 416d49e1aeSJan Lentfer }; 426d49e1aeSJan Lentfer 436d49e1aeSJan Lentfer 446d49e1aeSJan Lentfer /* control instance -- opaque struct declaration 456d49e1aeSJan Lentfer */ 466d49e1aeSJan Lentfer struct httpread; 476d49e1aeSJan Lentfer 486d49e1aeSJan Lentfer 496d49e1aeSJan Lentfer /* httpread_destroy -- if h is non-NULL, clean up 506d49e1aeSJan Lentfer * This must eventually be called by the application following 516d49e1aeSJan Lentfer * call of the application's callback and may be called 526d49e1aeSJan Lentfer * earlier if desired. 536d49e1aeSJan Lentfer */ 546d49e1aeSJan Lentfer void httpread_destroy(struct httpread *h); 556d49e1aeSJan Lentfer 566d49e1aeSJan Lentfer /* httpread_create -- start a new reading session making use of eloop. 576d49e1aeSJan Lentfer * The new instance will use the socket descriptor for reading (until 586d49e1aeSJan Lentfer * it gets a file and not after) but will not close the socket, even 596d49e1aeSJan Lentfer * when the instance is destroyed (the application must do that). 606d49e1aeSJan Lentfer * Return NULL on error. 616d49e1aeSJan Lentfer * 626d49e1aeSJan Lentfer * Provided that httpread_create successfully returns a handle, 636d49e1aeSJan Lentfer * the callback fnc is called to handle httpread_event events. 646d49e1aeSJan Lentfer * The caller should do destroy on any errors or unknown events. 656d49e1aeSJan Lentfer * 666d49e1aeSJan Lentfer * Pass max_bytes == 0 to not read body at all (required for e.g. 676d49e1aeSJan Lentfer * reply to HEAD request). 686d49e1aeSJan Lentfer */ 696d49e1aeSJan Lentfer struct httpread * httpread_create( 706d49e1aeSJan Lentfer int sd, /* descriptor of TCP socket to read from */ 716d49e1aeSJan Lentfer void (*cb)(struct httpread *handle, void *cookie, 726d49e1aeSJan Lentfer enum httpread_event e), /* call on event */ 736d49e1aeSJan Lentfer void *cookie, /* pass to callback */ 746d49e1aeSJan Lentfer int max_bytes, /* maximum file size else abort it */ 756d49e1aeSJan Lentfer int timeout_seconds /* 0; or total duration timeout period */ 766d49e1aeSJan Lentfer ); 776d49e1aeSJan Lentfer 786d49e1aeSJan Lentfer /* httpread_hdr_type_get -- When file is ready, returns header type. 796d49e1aeSJan Lentfer */ 806d49e1aeSJan Lentfer enum httpread_hdr_type httpread_hdr_type_get(struct httpread *h); 816d49e1aeSJan Lentfer 826d49e1aeSJan Lentfer 836d49e1aeSJan Lentfer /* httpread_uri_get -- When file is ready, uri_get returns (translated) URI 846d49e1aeSJan Lentfer * or possibly NULL (which would be an error). 856d49e1aeSJan Lentfer */ 866d49e1aeSJan Lentfer char *httpread_uri_get(struct httpread *h); 876d49e1aeSJan Lentfer 886d49e1aeSJan Lentfer /* httpread_reply_code_get -- When reply is ready, returns reply code */ 896d49e1aeSJan Lentfer int httpread_reply_code_get(struct httpread *h); 906d49e1aeSJan Lentfer 916d49e1aeSJan Lentfer 926d49e1aeSJan Lentfer /* httpread_length_get -- When file is ready, returns file length. */ 936d49e1aeSJan Lentfer int httpread_length_get(struct httpread *h); 946d49e1aeSJan Lentfer 956d49e1aeSJan Lentfer /* httpread_data_get -- When file is ready, returns file content 966d49e1aeSJan Lentfer * with null byte appened. 976d49e1aeSJan Lentfer * Might return NULL in some error condition. 986d49e1aeSJan Lentfer */ 996d49e1aeSJan Lentfer void * httpread_data_get(struct httpread *h); 1006d49e1aeSJan Lentfer 1016d49e1aeSJan Lentfer /* httpread_hdr_get -- When file is ready, returns header content 1026d49e1aeSJan Lentfer * with null byte appended. 1036d49e1aeSJan Lentfer * Might return NULL in some error condition. 1046d49e1aeSJan Lentfer */ 1056d49e1aeSJan Lentfer char * httpread_hdr_get(struct httpread *h); 1066d49e1aeSJan Lentfer 1076d49e1aeSJan Lentfer /* httpread_hdr_line_get -- When file is ready, returns pointer 1086d49e1aeSJan Lentfer * to line within header content matching the given tag 1096d49e1aeSJan Lentfer * (after the tag itself and any spaces/tabs). 1106d49e1aeSJan Lentfer * 1116d49e1aeSJan Lentfer * The tag should end with a colon for reliable matching. 1126d49e1aeSJan Lentfer * 1136d49e1aeSJan Lentfer * If not found, returns NULL; 1146d49e1aeSJan Lentfer */ 1156d49e1aeSJan Lentfer char * httpread_hdr_line_get(struct httpread *h, const char *tag); 1166d49e1aeSJan Lentfer 1176d49e1aeSJan Lentfer #endif /* HTTPREAD_H */ 118