xref: /dflybsd-src/contrib/wpa_supplicant/src/wps/httpread.h (revision bcf9aa4feb4a2fdf8ceac276d271a57f4b27e13d)
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