Home | History | Annotate | Download | only in include
      1 /*
      2     This file is part of libmicrospdy
      3     Copyright Copyright (C) 2012, 2013 Christian Grothoff
      4 
      5     This program is free software: you can redistribute it and/or modify
      6     it under the terms of the GNU General Public License as published by
      7     the Free Software Foundation, either version 3 of the License, or
      8     (at your option) any later version.
      9 
     10     This program is distributed in the hope that it will be useful,
     11     but WITHOUT ANY WARRANTY; without even the implied warranty of
     12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13     GNU General Public License for more details.
     14 
     15     You should have received a copy of the GNU General Public License
     16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
     17 */
     18 
     19 /**
     20  * @file microspdy.h
     21  * @brief public interface to libmicrospdy
     22  * @author Andrey Uzunov
     23  * @author Christian Grothoff
     24  *
     25  * All symbols defined in this header start with SPDY_.  libmisrospdy is a small
     26  * SPDY daemon library. The application can start multiple daemons
     27  * and they are independent.<p>
     28  *
     29  * The header file defines various constants used by the SPDY and the HTTP protocol.
     30  * This does not mean that the lib actually interprets all of these
     31  * values. Not everything is implemented. The provided constants are exported as a convenience
     32  * for users of the library.  The lib does not verify that provided
     33  * HTTP headers and if their values conform to the SPDY protocol,
     34  * it only checks if the required headers for the SPDY requests and
     35  * responses are provided.<p>
     36  *
     37  * The library uses just a single thread.<p>
     38  *
     39  * Before including "microspdy.h" you should add the necessary
     40  * includes to define the types used in this file (which headers are needed may
     41  * depend on your platform; for possible suggestions consult
     42  * "platform.h" in the libmicrospdy distribution).<p>
     43  *
     44  * All of the functions returning SPDY_YES/SPDY_NO return
     45  * SPDY_INPUT_ERROR when any of the parameters are invalid, e.g.
     46  * required parameter is NULL.<p>
     47  *
     48  * The library does not check if anything at the application layer --
     49  * requests and responses -- is correct. For example, it
     50  * is up to the user to check if a client is sending HTTP body but the
     51  * method is GET.<p>
     52  *
     53  * The SPDY flow control is just partially implemented: the receiving
     54  * window is updated, and the client is notified, to prevent a client
     55  * from stop sending POST body data, for example.
     56  */
     57 #ifndef SPDY_MICROSPDY_H
     58 #define SPDY_MICROSPDY_H
     59 
     60 #include <zlib.h>
     61 #include <stdbool.h>
     62 
     63 /* While we generally would like users to use a configure-driven
     64    build process which detects which headers are present and
     65    hence works on any platform, we use "standard" includes here
     66    to build out-of-the-box for beginning users on common systems.
     67 
     68    Once you have a proper build system and go for more exotic
     69    platforms, you should define MHD_PLATFORM_H in some header that
     70    you always include *before* "microhttpd.h".  Then the following
     71    "standard" includes won't be used (which might be a good
     72    idea, especially on platforms where they do not exist). */
     73 #ifndef MHD_PLATFORM_H
     74 #include <unistd.h>
     75 #include <stdarg.h>
     76 #include <stdint.h>
     77 #ifdef __MINGW32__
     78 #include <ws2tcpip.h>
     79 #else
     80 #include <sys/time.h>
     81 #include <sys/types.h>
     82 #include <sys/socket.h>
     83 #endif
     84 #endif
     85 
     86 #ifndef _MHD_EXTERN
     87 #define _MHD_EXTERN extern
     88 #endif
     89 
     90 /**
     91  * return code for "YES".
     92  */
     93 #define SPDY_YES 1
     94 
     95 /**
     96  * return code for "NO".
     97  */
     98 #define SPDY_NO 0
     99 
    100 /**
    101  * return code for error when input parameters are wrong. To be returned
    102  * only by functions which return int. The others will return NULL on
    103  * input error.
    104  */
    105 #define SPDY_INPUT_ERROR -1
    106 
    107 /**
    108  * SPDY version supported by the lib.
    109  */
    110 #define SPDY_VERSION 3
    111 
    112 /**
    113  * The maximum allowed size (without 8 byte headers) of
    114  * SPDY frames (value length) is 8192. The lib will accept and
    115  * send frames with length at most this value here.
    116  */
    117 #define SPDY_MAX_SUPPORTED_FRAME_SIZE 8192
    118 
    119 /**
    120  * HTTP response codes.
    121  */
    122 #define SPDY_HTTP_CONTINUE 100
    123 #define SPDY_HTTP_SWITCHING_PROTOCOLS 101
    124 #define SPDY_HTTP_PROCESSING 102
    125 
    126 #define SPDY_HTTP_OK 200
    127 #define SPDY_HTTP_CREATED 201
    128 #define SPDY_HTTP_ACCEPTED 202
    129 #define SPDY_HTTP_NON_AUTHORITATIVE_INFORMATION 203
    130 #define SPDY_HTTP_NO_CONTENT 204
    131 #define SPDY_HTTP_RESET_CONTENT 205
    132 #define SPDY_HTTP_PARTIAL_CONTENT 206
    133 #define SPDY_HTTP_MULTI_STATUS 207
    134 
    135 #define SPDY_HTTP_MULTIPLE_CHOICES 300
    136 #define SPDY_HTTP_MOVED_PERMANENTLY 301
    137 #define SPDY_HTTP_FOUND 302
    138 #define SPDY_HTTP_SEE_OTHER 303
    139 #define SPDY_HTTP_NOT_MODIFIED 304
    140 #define SPDY_HTTP_USE_PROXY 305
    141 #define SPDY_HTTP_SWITCH_PROXY 306
    142 #define SPDY_HTTP_TEMPORARY_REDIRECT 307
    143 
    144 #define SPDY_HTTP_BAD_REQUEST 400
    145 #define SPDY_HTTP_UNAUTHORIZED 401
    146 #define SPDY_HTTP_PAYMENT_REQUIRED 402
    147 #define SPDY_HTTP_FORBIDDEN 403
    148 #define SPDY_HTTP_NOT_FOUND 404
    149 #define SPDY_HTTP_METHOD_NOT_ALLOWED 405
    150 #define SPDY_HTTP_METHOD_NOT_ACCEPTABLE 406
    151 #define SPDY_HTTP_PROXY_AUTHENTICATION_REQUIRED 407
    152 #define SPDY_HTTP_REQUEST_TIMEOUT 408
    153 #define SPDY_HTTP_CONFLICT 409
    154 #define SPDY_HTTP_GONE 410
    155 #define SPDY_HTTP_LENGTH_REQUIRED 411
    156 #define SPDY_HTTP_PRECONDITION_FAILED 412
    157 #define SPDY_HTTP_REQUEST_ENTITY_TOO_LARGE 413
    158 #define SPDY_HTTP_REQUEST_URI_TOO_LONG 414
    159 #define SPDY_HTTP_UNSUPPORTED_MEDIA_TYPE 415
    160 #define SPDY_HTTP_REQUESTED_RANGE_NOT_SATISFIABLE 416
    161 #define SPDY_HTTP_EXPECTATION_FAILED 417
    162 #define SPDY_HTTP_UNPROCESSABLE_ENTITY 422
    163 #define SPDY_HTTP_LOCKED 423
    164 #define SPDY_HTTP_FAILED_DEPENDENCY 424
    165 #define SPDY_HTTP_UNORDERED_COLLECTION 425
    166 #define SPDY_HTTP_UPGRADE_REQUIRED 426
    167 #define SPDY_HTTP_NO_RESPONSE 444
    168 #define SPDY_HTTP_RETRY_WITH 449
    169 #define SPDY_HTTP_BLOCKED_BY_WINDOWS_PARENTAL_CONTROLS 450
    170 #define SPDY_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS 451
    171 
    172 #define SPDY_HTTP_INTERNAL_SERVER_ERROR 500
    173 #define SPDY_HTTP_NOT_IMPLEMENTED 501
    174 #define SPDY_HTTP_BAD_GATEWAY 502
    175 #define SPDY_HTTP_SERVICE_UNAVAILABLE 503
    176 #define SPDY_HTTP_GATEWAY_TIMEOUT 504
    177 #define SPDY_HTTP_HTTP_VERSION_NOT_SUPPORTED 505
    178 #define SPDY_HTTP_VARIANT_ALSO_NEGOTIATES 506
    179 #define SPDY_HTTP_INSUFFICIENT_STORAGE 507
    180 #define SPDY_HTTP_BANDWIDTH_LIMIT_EXCEEDED 509
    181 #define SPDY_HTTP_NOT_EXTENDED 510
    182 
    183 /**
    184  * HTTP headers are used in SPDY, but all of them MUST be lowercase.
    185  * Some are not valid in SPDY and MUST not be used
    186  */
    187 #define SPDY_HTTP_HEADER_ACCEPT "accept"
    188 #define SPDY_HTTP_HEADER_ACCEPT_CHARSET "accept-charset"
    189 #define SPDY_HTTP_HEADER_ACCEPT_ENCODING "accept-encoding"
    190 #define SPDY_HTTP_HEADER_ACCEPT_LANGUAGE "accept-language"
    191 #define SPDY_HTTP_HEADER_ACCEPT_RANGES "accept-ranges"
    192 #define SPDY_HTTP_HEADER_AGE "age"
    193 #define SPDY_HTTP_HEADER_ALLOW "allow"
    194 #define SPDY_HTTP_HEADER_AUTHORIZATION "authorization"
    195 #define SPDY_HTTP_HEADER_CACHE_CONTROL "cache-control"
    196 /* Connection header is forbidden in SPDY */
    197 #define SPDY_HTTP_HEADER_CONNECTION "connection"
    198 #define SPDY_HTTP_HEADER_CONTENT_ENCODING "content-encoding"
    199 #define SPDY_HTTP_HEADER_CONTENT_LANGUAGE "content-language"
    200 #define SPDY_HTTP_HEADER_CONTENT_LENGTH "content-length"
    201 #define SPDY_HTTP_HEADER_CONTENT_LOCATION "content-location"
    202 #define SPDY_HTTP_HEADER_CONTENT_MD5 "content-md5"
    203 #define SPDY_HTTP_HEADER_CONTENT_RANGE "content-range"
    204 #define SPDY_HTTP_HEADER_CONTENT_TYPE "content-type"
    205 #define SPDY_HTTP_HEADER_COOKIE "cookie"
    206 #define SPDY_HTTP_HEADER_DATE "date"
    207 #define SPDY_HTTP_HEADER_ETAG "etag"
    208 #define SPDY_HTTP_HEADER_EXPECT "expect"
    209 #define SPDY_HTTP_HEADER_EXPIRES "expires"
    210 #define SPDY_HTTP_HEADER_FROM "from"
    211 /* Host header is forbidden in SPDY */
    212 #define SPDY_HTTP_HEADER_HOST "host"
    213 #define SPDY_HTTP_HEADER_IF_MATCH "if-match"
    214 #define SPDY_HTTP_HEADER_IF_MODIFIED_SINCE "if-modified-since"
    215 #define SPDY_HTTP_HEADER_IF_NONE_MATCH "if-none-match"
    216 #define SPDY_HTTP_HEADER_IF_RANGE "if-range"
    217 #define SPDY_HTTP_HEADER_IF_UNMODIFIED_SINCE "if-unmodified-since"
    218 /* Keep-Alive header is forbidden in SPDY */
    219 #define SPDY_HTTP_HEADER_KEEP_ALIVE "keep-alive"
    220 #define SPDY_HTTP_HEADER_LAST_MODIFIED "last-modified"
    221 #define SPDY_HTTP_HEADER_LOCATION "location"
    222 #define SPDY_HTTP_HEADER_MAX_FORWARDS "max-forwards"
    223 #define SPDY_HTTP_HEADER_PRAGMA "pragma"
    224 #define SPDY_HTTP_HEADER_PROXY_AUTHENTICATE "proxy-authenticate"
    225 #define SPDY_HTTP_HEADER_PROXY_AUTHORIZATION "proxy-authorization"
    226 /* Proxy-Connection header is forbidden in SPDY */
    227 #define SPDY_HTTP_HEADER_PROXY_CONNECTION "proxy-connection"
    228 #define SPDY_HTTP_HEADER_RANGE "range"
    229 #define SPDY_HTTP_HEADER_REFERER "referer"
    230 #define SPDY_HTTP_HEADER_RETRY_AFTER "retry-after"
    231 #define SPDY_HTTP_HEADER_SERVER "server"
    232 #define SPDY_HTTP_HEADER_SET_COOKIE "set-cookie"
    233 #define SPDY_HTTP_HEADER_SET_COOKIE2 "set-cookie2"
    234 #define SPDY_HTTP_HEADER_TE "te"
    235 #define SPDY_HTTP_HEADER_TRAILER "trailer"
    236 /* Transfer-Encoding header is forbidden in SPDY */
    237 #define SPDY_HTTP_HEADER_TRANSFER_ENCODING "transfer-encoding"
    238 #define SPDY_HTTP_HEADER_UPGRADE "upgrade"
    239 #define SPDY_HTTP_HEADER_USER_AGENT "user-agent"
    240 #define SPDY_HTTP_HEADER_VARY "vary"
    241 #define SPDY_HTTP_HEADER_VIA "via"
    242 #define SPDY_HTTP_HEADER_WARNING "warning"
    243 #define SPDY_HTTP_HEADER_WWW_AUTHENTICATE "www-authenticate"
    244 
    245 /**
    246  * HTTP versions (a value must be provided in SPDY requests/responses).
    247  */
    248 #define SPDY_HTTP_VERSION_1_0 "HTTP/1.0"
    249 #define SPDY_HTTP_VERSION_1_1 "HTTP/1.1"
    250 
    251 /**
    252  * HTTP methods
    253  */
    254 #define SPDY_HTTP_METHOD_CONNECT "CONNECT"
    255 #define SPDY_HTTP_METHOD_DELETE "DELETE"
    256 #define SPDY_HTTP_METHOD_GET "GET"
    257 #define SPDY_HTTP_METHOD_HEAD "HEAD"
    258 #define SPDY_HTTP_METHOD_OPTIONS "OPTIONS"
    259 #define SPDY_HTTP_METHOD_POST "POST"
    260 #define SPDY_HTTP_METHOD_PUT "PUT"
    261 #define SPDY_HTTP_METHOD_TRACE "TRACE"
    262 
    263 /**
    264  * HTTP POST encodings, see also
    265  * http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4
    266  */
    267 #define SPDY_HTTP_POST_ENCODING_FORM_URLENCODED "application/x-www-form-urlencoded"
    268 #define SPDY_HTTP_POST_ENCODING_MULTIPART_FORMDATA "multipart/form-data"
    269 
    270 
    271 /**
    272  * Handle for the daemon (listening on a socket).
    273  */
    274 struct SPDY_Daemon;
    275 
    276 
    277 /**
    278  * Handle for a SPDY session/connection.
    279  */
    280 struct SPDY_Session;
    281 
    282 
    283 /**
    284  * Handle for a SPDY request sent by a client. The structure has pointer
    285  * to the session's handler
    286  */
    287 struct SPDY_Request;
    288 
    289 
    290 /**
    291  * Handle for a response containing HTTP headers and data to be sent.
    292  * The structure has pointer to the session's handler
    293  * for this response.
    294  */
    295 struct SPDY_Response;
    296 
    297 
    298 /**
    299  * Collection of tuples of an HTTP header and values used in requests
    300  * and responses.
    301  */
    302 struct SPDY_NameValue;
    303 
    304 
    305 /**
    306  * Collection of tuples of a SPDY setting ID, value
    307  * and flags used to control the sessions.
    308  */
    309 struct SPDY_Settings;
    310 
    311 
    312 /**
    313  * SPDY IO sybsystem flags used by SPDY_init() and SPDY_deinit().<p>
    314  *
    315  * The values are used internally as flags, that is why they must be
    316  * powers of 2.
    317  */
    318 enum SPDY_IO_SUBSYSTEM
    319 {
    320 
    321   /**
    322    * No subsystem. For internal use.
    323    */
    324   SPDY_IO_SUBSYSTEM_NONE = 0,
    325 
    326   /**
    327    * Default TLS implementation provided by openSSL/libssl.
    328    */
    329   SPDY_IO_SUBSYSTEM_OPENSSL = 1,
    330 
    331   /**
    332    * No TLS is used.
    333    */
    334   SPDY_IO_SUBSYSTEM_RAW = 2
    335 };
    336 
    337 
    338 /**
    339  * SPDY daemon options. Passed in the varargs portion of
    340  * SPDY_start_daemon to customize the daemon. Each option must
    341  * be followed by a value of a specific type.<p>
    342  *
    343  * The values are used internally as flags, that is why they must be
    344  * powers of 2.
    345  */
    346 enum SPDY_DAEMON_OPTION
    347 {
    348 
    349   /**
    350    * No more options / last option.  This is used
    351    * to terminate the VARARGs list.
    352    */
    353   SPDY_DAEMON_OPTION_END = 0,
    354 
    355   /**
    356    * Set a custom timeout for all connections.  Must be followed by
    357    * a number of seconds, given as an 'unsigned int'.  Use
    358    * zero for no timeout.
    359    */
    360   SPDY_DAEMON_OPTION_SESSION_TIMEOUT = 1,
    361 
    362   /**
    363    * Bind daemon to the supplied sockaddr. This option must be
    364    * followed by a 'struct sockaddr *'.  The 'struct sockaddr*'
    365    * should point to a 'struct sockaddr_in6' or to a
    366    * 'struct sockaddr_in'.
    367    */
    368   SPDY_DAEMON_OPTION_SOCK_ADDR = 2,
    369 
    370   /**
    371    * Flags for the daemon. Must be followed by a SPDY_DAEMON_FLAG value
    372    * which is the result of bitwise OR of desired flags.
    373    */
    374   SPDY_DAEMON_OPTION_FLAGS = 4,
    375 
    376   /**
    377    * IO subsystem type used by daemon and all its sessions. If not set,
    378    * TLS provided by openssl is used. Must be followed by a
    379    * SPDY_IO_SUBSYSTEM value.
    380    */
    381   SPDY_DAEMON_OPTION_IO_SUBSYSTEM = 8,
    382 
    383   /**
    384    * Maximum number of frames to be written to the socket at once. The
    385    * library tries to send max_num_frames in a single call to SPDY_run
    386    * for a single session. This means no requests can be received nor
    387    * other sessions can send data as long the current one has enough
    388    * frames to send and there is no error on writing. Thus, a big value
    389    * will affect the performance. Small value gives fairnes for sessions.
    390    * Must be followed by a positive integer (uin32_t). If not set, the
    391    * default value 10 will be used.
    392    */
    393   SPDY_DAEMON_OPTION_MAX_NUM_FRAMES = 16
    394 };
    395 
    396 
    397 /**
    398  * Flags for starting SPDY daemon. They are used to set some settings
    399  * for the daemon, which do not require values.
    400  */
    401 enum SPDY_DAEMON_FLAG
    402 {
    403   /**
    404    * No flags selected.
    405    */
    406   SPDY_DAEMON_FLAG_NO = 0,
    407 
    408   /**
    409    * The server will bind only on IPv6 addresses. If the flag is set and
    410    * the daemon is provided with IPv4 address or IPv6 is not supported,
    411    * starting daemon will fail.
    412    */
    413   SPDY_DAEMON_FLAG_ONLY_IPV6 = 1,
    414 
    415   /**
    416    * All sessions' sockets will be set with TCP_NODELAY if the flag is
    417    * used. Option considered only by SPDY_IO_SUBSYSTEM_RAW.
    418    */
    419   SPDY_DAEMON_FLAG_NO_DELAY = 2
    420 };
    421 
    422 
    423 /**
    424  * SPDY settings IDs sent by both client and server in SPDY SETTINGS frame.
    425  * They affect the whole SPDY session. Defined in SPDY Protocol - Draft 3.
    426  */
    427 enum SPDY_SETTINGS
    428 {
    429 
    430   /**
    431    * Allows the sender to send its expected upload bandwidth on this
    432    * channel. This number is an estimate. The value should be the
    433    * integral number of kilobytes per second that the sender predicts
    434    * as an expected maximum upload channel capacity.
    435    */
    436   SPDY_SETTINGS_UPLOAD_BANDWIDTH = 1,
    437 
    438   /**
    439    * Allows the sender to send its expected download bandwidth on this
    440    * channel. This number is an estimate. The value should be the
    441    * integral number of kilobytes per second that the sender predicts as
    442    * an expected maximum download channel capacity.
    443    */
    444   SPDY_SETTINGS_DOWNLOAD_BANDWIDTH = 2,
    445 
    446   /**
    447    * Allows the sender to send its expected round-trip-time on this
    448    * channel. The round trip time is defined as the minimum amount of
    449    * time to send a control frame from this client to the remote and
    450    * receive a response. The value is represented in milliseconds.
    451    */
    452   SPDY_SETTINGS_ROUND_TRIP_TIME = 3,
    453 
    454   /**
    455    * Allows the sender to inform the remote endpoint the maximum number
    456    * of concurrent streams which it will allow. By default there is no
    457    * limit. For implementors it is recommended that this value be no
    458    * smaller than 100.
    459    */
    460   SPDY_SETTINGS_MAX_CONCURRENT_STREAMS = 4,
    461 
    462   /**
    463    * Allows the sender to inform the remote endpoint of the current TCP
    464    * CWND value.
    465    */
    466   SPDY_SETTINGS_CURRENT_CWND = 5,
    467 
    468   /**
    469    * Allows the sender to inform the remote endpoint the retransmission
    470    * rate (bytes retransmitted / total bytes transmitted).
    471    */
    472   SPDY_SETTINGS_DOWNLOAD_RETRANS_RATE = 6,
    473 
    474   /**
    475    * Allows the sender to inform the remote endpoint the initial window
    476    * size (in bytes) for new streams.
    477    */
    478   SPDY_SETTINGS_INITIAL_WINDOW_SIZE = 7,
    479 
    480   /**
    481    * Allows the server to inform the client if the new size of the
    482    * client certificate vector.
    483    */
    484   SPDY_SETTINGS_CLIENT_CERTIFICATE_VECTOR_SIZE = 8
    485 };
    486 
    487 
    488 /**
    489  * Flags for each individual SPDY setting in the SPDY SETTINGS frame.
    490  * They affect only one setting to which they are set.
    491  * Defined in SPDY Protocol - Draft 3.
    492  */
    493 enum SPDY_FLAG_SETTINGS
    494 {
    495 
    496   /**
    497    * When set, the sender of this SETTINGS frame is requesting that the
    498    * recipient persist the ID/Value and return it in future SETTINGS
    499    * frames sent from the sender to this recipient. Because persistence
    500    * is only implemented on the client, this flag is only sent by the
    501    * server.
    502    */
    503   SPDY_FLAG_SETTINGS_PERSIST_VALUE = 1,
    504 
    505   /**
    506    * When set, the sender is notifying the recipient that this ID/Value
    507    * pair was previously sent to the sender by the recipient with the
    508    * #SPDY_FLAG_SETTINGS_PERSIST_VALUE, and the sender is returning it.
    509    * Because persistence is only implemented on the client, this flag is
    510    * only sent by the client.
    511    */
    512   SPDY_FLAG_SETTINGS_PERSISTED = 2
    513 };
    514 
    515 
    516 /**
    517  * Flag associated with a whole SPDY SETTINGS frame. Affect all the
    518  * settings in the frame. Defined in SPDY Protocol - Draft 3.
    519  */
    520 enum SPDY_FLAG_SETTINGS_FRAME
    521 {
    522 
    523   /**
    524    * When set, the client should clear any previously persisted SETTINGS
    525    * ID/Value pairs. If this frame contains ID/Value pairs with the
    526    * #SPDY_FLAG_SETTINGS_PERSIST_VALUE set, then the client will first
    527    * clear its existing, persisted settings, and then persist the values
    528    * with the flag set which are contained within this frame. Because
    529    * persistence is only implemented on the client, this flag can only
    530    * be used when the sender is the server.
    531    */
    532   SPDY_FLAG_SETTINGS_CLEAR_SETTINGS = 1
    533 };
    534 
    535 
    536 /**
    537  * SPDY settings function options. Passed in the varargs portion of
    538  * SPDY_SettingsReceivedCallback and SPDY_send_settings to customize
    539  * more the settings handling. Each option must
    540  * be followed by a value of a specific type.<p>
    541  *
    542  * The values are used internally as flags, that is why they must be
    543  * powers of 2.
    544  */
    545 enum SPDY_SETTINGS_OPTION
    546 {
    547 
    548   /**
    549    * No more options / last option.  This is used
    550    * to terminate the VARARGs list.
    551    */
    552   SPDY_SETTINGS_OPTION_END = 0
    553 };
    554 
    555 
    556 /**
    557  * Used as a parameter for SPDY_ResponseResultCallback and shows if the
    558  * response was actually written to the TLS socket or discarded by the
    559  * lib for any reason (and respectively the reason).
    560  */
    561 enum SPDY_RESPONSE_RESULT
    562 {
    563 
    564   /**
    565    * The lib has written the full response to the TLS socket.
    566    */
    567   SPDY_RESPONSE_RESULT_SUCCESS = 0,
    568 
    569   /**
    570    * The session is being closed, so the data is being discarded
    571    */
    572   SPDY_RESPONSE_RESULT_SESSION_CLOSED = 1,
    573 
    574   /**
    575    * The stream for this response has been closed. May happen when the
    576    * sender had sent first SYN_STREAM and after that RST_STREAM.
    577    */
    578   SPDY_RESPONSE_RESULT_STREAM_CLOSED = 2
    579 };
    580 
    581 
    582 /**
    583  * Callback for serious error condition. The default action is to print
    584  * an error message and abort().
    585  *
    586  * @param cls user specified value
    587  * @param file where the error occured
    588  * @param line where the error occured
    589  * @param reason error details message, may be NULL
    590  */
    591 typedef void
    592 (*SPDY_PanicCallback) (void * cls,
    593                        const char *file,
    594                        unsigned int line,
    595                        const char *reason);
    596 
    597 
    598 /**
    599  * Callback for new SPDY session established by a client. Called
    600  * immediately after the TCP connection was established.
    601  *
    602  * @param cls client-defined closure
    603  * @param session handler for the new SPDY session
    604  */
    605 typedef void
    606 (*SPDY_NewSessionCallback) (void * cls,
    607                             struct SPDY_Session * session);
    608 
    609 
    610 /**
    611  * Callback for closed session. Called after the TCP connection was
    612  * closed. In this callback function the user has the last
    613  * chance to access the SPDY_Session structure. After that the latter
    614  * will be cleaned!
    615  *
    616  * @param cls client-defined closure
    617  * @param session handler for the closed SPDY session
    618  * @param by_client #SPDY_YES if the session close was initiated by the
    619  * 					client;
    620  * 		    #SPDY_NO if closed by the server
    621  */
    622 typedef void
    623 (*SPDY_SessionClosedCallback) (void *cls,
    624                                struct SPDY_Session *session,
    625                                int by_client);
    626 
    627 
    628 /**
    629  * Iterator over name-value pairs.
    630  *
    631  * @param cls client-defined closure
    632  * @param name of the pair
    633  * @param value of the pair
    634  * @return #SPDY_YES to continue iterating,
    635  *         #SPDY_NO to abort the iteration
    636  */
    637 typedef int
    638 (*SPDY_NameValueIterator) (void *cls,
    639                            const char *name,
    640                            const char * const * value,
    641                            int num_values);
    642 
    643 
    644 /**
    645  * Callback for received SPDY request. The functions is called whenever
    646  * a reqest comes, but will also be called if more headers/trailers are
    647  * received.
    648  *
    649  * @param cls client-defined closure
    650  * @param request handler. The request object is required for
    651  * 			sending responses.
    652  * @param priority of the SPDY stream which the request was
    653  * 			sent over
    654  * @param method HTTP method
    655  * @param path HTTP path
    656  * @param version HTTP version just like in HTTP request/response:
    657  * 			"HTTP/1.0" or "HTTP/1.1" currently
    658  * @param host called host as in HTTP
    659  * @param scheme used ("http" or "https"). In SPDY 3 it is only "https".
    660  * @param headers other HTTP headers from the request
    661  * @param more a flag saying if more data related to the request is
    662  *        expected to be received. HTTP body may arrive (e.g. POST data);
    663  *        then SPDY_NewDataCallback will be called for the connection.
    664  *        It is also possible that more headers/trailers arrive;
    665  *        then the same callback will be invoked. The user should detect
    666  *        that it is not the first invocation of the function for that
    667  *        request.
    668  */
    669 typedef void
    670 (*SPDY_NewRequestCallback) (void *cls,
    671                             struct SPDY_Request *request,
    672                             uint8_t priority,
    673                             const char *method,
    674                             const char *path,
    675                             const char *version,
    676                             const char *host,
    677                             const char *scheme,
    678                             struct SPDY_NameValue *headers,
    679                             bool more);
    680 
    681 
    682 /**
    683  * Callback for received new data chunk (HTTP body) from a given
    684  * request (e.g. POST data).
    685  *
    686  * @param cls client-defined closure
    687  * @param request handler
    688  * @param buf data chunk from the POST data
    689  * @param size the size of the data chunk 'buf' in bytes. Note that it
    690  *             may be 0.
    691  * @param more false if this is the last chunk from the data. Note:
    692  *             true does not mean that more data will come, exceptional
    693  *             situation is possible
    694  * @return #SPDY_YES to continue calling the function,
    695  *         #SPDY_NO to stop calling the function for this request
    696  */
    697 typedef int
    698 (*SPDY_NewDataCallback) (void *cls,
    699                          struct SPDY_Request *request,
    700                          const void *buf,
    701                          size_t size,
    702                          bool more);
    703 // How about passing POST encoding information
    704 // here as well?
    705 //TODO
    706 
    707 
    708 /**
    709  * Callback to be used with SPDY_build_response_with_callback. The
    710  * callback will be called when the lib wants to write to the TLS socket.
    711  * The application should provide the data to be sent.
    712  *
    713  * @param cls client-defined closure
    714  * @param max maximum number of bytes that are allowed to be written
    715  * 			to the buffer.
    716  * @param more true if more data will be sent (i.e. the function must
    717  * 				be calleed again),
    718  *             false if this is the last chunk, the lib will close
    719  * 				the stream
    720  * @return number of bytes written to buffer. On error the call MUST
    721  * 			return value less than 0 to indicate the library.
    722  */
    723 typedef ssize_t
    724 (*SPDY_ResponseCallback) (void *cls,
    725                           void *buffer,
    726                           size_t max,
    727                           bool *more);
    728 
    729 
    730 /**
    731  * Callback to be called when the last bytes from the response was sent
    732  * to the client or when the response was discarded from the lib. This
    733  * callback is a very good place to discard the request and the response
    734  * objects, if they will not be reused (e.g., sending the same response
    735  * again). If the stream is closed it is safe to discard the request
    736  * object.
    737  *
    738  * @param cls client-defined closure
    739  * @param response handler to the response that was just sent
    740  * @param request handler to the request for which the response was sent
    741  * @param status shows if actually the response was sent or it was
    742  * 			discarded by the lib for any reason (e.g., closing session,
    743  * 			closing stream, stopping daemon, etc.). It is possible that
    744  * 			status indicates an error but parts of the response headers
    745  * 			and/or body (in one
    746  * 			or several frames) were already sent to the client.
    747  * @param streamopened indicates if the the stream for this request/
    748  * 			response pair is still opened. If yes, the server may want
    749  * 			to use SPDY push to send something additional to the client
    750  * 			and/or close the stream.
    751  */
    752 typedef void
    753 (*SPDY_ResponseResultCallback) (void * cls,
    754                                 struct SPDY_Response *response,
    755                                 struct SPDY_Request *request,
    756                                 enum SPDY_RESPONSE_RESULT status,
    757                                 bool streamopened);
    758 
    759 
    760 /**
    761  * Callback to notify when SPDY ping response is received.
    762  *
    763  * @param session handler for which the ping request was sent
    764  * @param rtt the timespan between sending ping request and receiving it
    765  * 			from the library
    766  */
    767 typedef void
    768 (*SPDY_PingCallback) (void * cls,
    769                       struct SPDY_Session *session,
    770                       struct timeval *rtt);
    771 
    772 
    773 /**
    774  * Iterator over settings ID/Value/Flags tuples.
    775  *
    776  * @param cls client-defined closure
    777  * @param id SPDY settings ID
    778  * @param value value for this setting
    779  * @param flags flags for this tuple; use
    780  * 			`enum SPDY_FLAG_SETTINGS`
    781  * @return #SPDY_YES to continue iterating,
    782  *         #SPDY_NO to abort the iteration
    783  */
    784 typedef int
    785 (*SPDY_SettingsIterator) (void *cls,
    786                           enum SPDY_SETTINGS id,
    787                           int32_t value,
    788                           uint8_t flags);
    789 
    790 
    791 /**
    792  * Callback to notify when SPDY SETTINGS are received from the client.
    793  *
    794  * @param session handler for which settings are received
    795  * @param settings ID/value/flags tuples of the settings
    796  * @param flags for the whole settings frame; use
    797  * 			enum SPDY_FLAG_SETTINGS_FRAME
    798  * @param ... list of options (type-value pairs,
    799  *        terminated with #SPDY_SETTINGS_OPTION_END).
    800  */
    801 typedef void
    802 (*SPDY_SettingsReceivedCallback) (struct SPDY_Session *session,
    803                                   struct SPDY_Settings *settings,
    804                                   uint8_t flags,
    805                                   ...);
    806 
    807 
    808 /* Global functions for the library */
    809 
    810 
    811 /**
    812  * Init function for the whole library. It MUST be called before any
    813  * other function of the library to initialize things like TLS context
    814  * and possibly other stuff needed by the lib. Currently the call
    815  * always returns #SPDY_YES.
    816  *
    817  * @param io_subsystem the IO subsystem that will
    818  *        be initialized. Several can be used with bitwise OR. If no
    819  *        parameter is set, the default openssl subsystem will be used.
    820  * @return #SPDY_YES if the library was correctly initialized and its
    821  * 			functions can be used now;
    822  * 			#SPDY_NO on error
    823  */
    824 _MHD_EXTERN int
    825 (SPDY_init) (enum SPDY_IO_SUBSYSTEM io_subsystem, ...);
    826 #define SPDY_init() SPDY_init (SPDY_IO_SUBSYSTEM_OPENSSL)
    827 
    828 
    829 /**
    830  * Deinit function for the whole lib. It can be called after finishing
    831  * using the library. It frees and cleans up resources allocated in
    832  * SPDY_init. Currently the function does not do anything.
    833  */
    834 _MHD_EXTERN void
    835 SPDY_deinit (void);
    836 
    837 
    838 /**
    839  * Sets the global error handler to a different implementation. "cb"
    840  * will only be called in the case of typically fatal, serious
    841  * internal consistency issues.  These issues should only arise in the
    842  * case of serious memory corruption or similar problems with the
    843  * architecture as well as failed assertions.  While "cb" is allowed to
    844  * return and the lib will then try to continue, this is never safe.
    845  *
    846  * The default implementation that is used if no panic function is set
    847  * simply prints an error message and calls "abort".  Alternative
    848  * implementations might call "exit" or other similar functions.
    849  *
    850  * @param cb new error handler
    851  * @param cls passed to error handler
    852  */
    853 _MHD_EXTERN void
    854 SPDY_set_panic_func (SPDY_PanicCallback cb,
    855                      void *cls);
    856 
    857 
    858 /* Daemon functions */
    859 
    860 
    861 /**
    862  * Start a SPDY webserver on the given port.
    863  *
    864  * @param port to bind to. The value is ignored if address structure
    865  * 			is passed as daemon option
    866  * @param certfile path to the certificate that will be used by server
    867  * @param keyfile path to the keyfile for the certificate
    868  * @param nscb callback called when a new SPDY session is
    869  * 			established	by a client
    870  * @param sccb callback called when a session is closed
    871  * @param nrcb callback called when a client sends request
    872  * @param npdcb callback called when HTTP body (POST data) is received
    873  * 			after request
    874  * @param cls common extra argument to all of the callbacks
    875  * @param ... list of options (type-value pairs,
    876  *        terminated with #SPDY_DAEMON_OPTION_END).
    877  * @return NULL on error, handle to daemon on success
    878  */
    879 _MHD_EXTERN struct SPDY_Daemon *
    880 SPDY_start_daemon (uint16_t port,
    881                    const char *certfile,
    882                    const char *keyfile,
    883                    SPDY_NewSessionCallback nscb,
    884                    SPDY_SessionClosedCallback sccb,
    885                    SPDY_NewRequestCallback nrcb,
    886                    SPDY_NewDataCallback npdcb,
    887                    void *cls,
    888                    ...);
    889 
    890 
    891 /**
    892  * Shutdown the daemon. First all sessions are closed. It is NOT safe
    893  * to call this function in user callbacks.
    894  *
    895  * @param daemon to stop
    896  */
    897 _MHD_EXTERN void
    898 SPDY_stop_daemon (struct SPDY_Daemon *daemon);
    899 
    900 
    901 /**
    902  * Obtain the select sets for this daemon. Only those are retrieved,
    903  * which some processing should be done for, i.e. not all sockets are
    904  * added to write_fd_set.<p>
    905  *
    906  * It is possible that there is
    907  * nothing to be read from a socket but there is data either in the
    908  * TLS subsystem's read buffers or in libmicrospdy's read buffers, which
    909  * waits for being processed. In such case the file descriptor will be
    910  * added to write_fd_set. Since it is very likely for the socket to be
    911  * ready for writing, the select used in the application's event loop
    912  * will return with success, SPDY_run will be called, the data will be
    913  * processed and maybe something will be written to the socket. Without
    914  * this behaviour, considering a proper event loop, data may stay in the
    915  * buffers, but run is never called.
    916  *
    917  * @param daemon to get sets from
    918  * @param read_fd_set read set
    919  * @param write_fd_set write set
    920  * @param except_fd_set except set
    921  * @return largest FD added to any of the sets
    922  */
    923 _MHD_EXTERN int
    924 SPDY_get_fdset (struct SPDY_Daemon *daemon,
    925                 fd_set *read_fd_set,
    926                 fd_set *write_fd_set,
    927                 fd_set *except_fd_set);
    928 
    929 
    930 /**
    931  * Obtain timeout value for select for this daemon. The returned value
    932  * is how long select
    933  * should at most block, not the timeout value set for connections.
    934  *
    935  * @param daemon to query for timeout
    936  * @param timeout will be set to the timeout value (in milliseconds)
    937  * @return #SPDY_YES on success
    938  *         #SPDY_NO if no connections exist that
    939  * 			would necessiate the use of a timeout right now
    940  */
    941 _MHD_EXTERN int
    942 SPDY_get_timeout (struct SPDY_Daemon *daemon,
    943                   unsigned long long *timeout);
    944 
    945 
    946 /**
    947  * Run webserver operations. This method must be called in
    948  * the client event loop.
    949  *
    950  * @param daemon to run
    951  */
    952 _MHD_EXTERN void
    953 SPDY_run (struct SPDY_Daemon *daemon);
    954 
    955 
    956 /* SPDY Session handling functions */
    957 
    958 
    959 /**
    960  * Closes a SPDY session. SPDY clients and servers are expected to keep
    961  * sessions opened as long as possible. However, the server may want to
    962  * close some connections, e.g. if there are too many, to free some
    963  * resources. The function can also be used to close a specific session
    964  * if the client is not desired.
    965  *
    966  * @param session handler to be closed
    967  */
    968 _MHD_EXTERN void
    969 SPDY_close_session (struct SPDY_Session * session);
    970 
    971 
    972 /**
    973  * Associate a void pointer with a session. The data accessible by the
    974  * pointer can later be used wherever the session handler is available.
    975  *
    976  * @param session handler
    977  * @param cls any data pointed by a pointer to be accessible later
    978  */
    979 _MHD_EXTERN void
    980 SPDY_set_cls_to_session (struct SPDY_Session *session,
    981                          void *cls);
    982 
    983 
    984 /**
    985  * Retrieves the pointer associated with SPDY_set_cls_to_session().
    986  *
    987  * @param session handler to get its cls
    988  * @return same pointer added by SPDY_set_cls_to_session() or
    989  * 			NULL when nothing was associated
    990  */
    991 _MHD_EXTERN void *
    992 SPDY_get_cls_from_session (struct SPDY_Session *session);
    993 
    994 
    995 /**
    996  * Retrieves the remote address of a given session.
    997  *
    998  * @param session handler to get its remote address
    999  * @param addr out parameter; pointing to remote address
   1000  * @return length of the address structure
   1001  */
   1002 _MHD_EXTERN socklen_t
   1003 SPDY_get_remote_addr (struct SPDY_Session *session,
   1004                       struct sockaddr **addr);
   1005 
   1006 
   1007 /* SPDY name/value data structure handling functions */
   1008 
   1009 
   1010 /**
   1011  * Create a new NameValue structure. It is needed for putting inside the
   1012  * HTTP headers and their values for a response. The user should later
   1013  * destroy alone the structure.
   1014  *
   1015  * @return handler to the new empty structure or NULL on error
   1016  */
   1017 _MHD_EXTERN struct SPDY_NameValue *
   1018 SPDY_name_value_create (void);
   1019 
   1020 
   1021 /**
   1022  * Add name/value pair to a NameValue structure. SPDY_NO will be returned
   1023  * if the name/value pair is already in the structure. It is legal to
   1024  * add different values for the same name.
   1025  *
   1026  * @param container structure to which the new pair is added
   1027  * @param name for the value. Null-terminated string.
   1028  * @param value the value itself. Null-terminated string.
   1029  * @return #SPDY_NO on error or #SPDY_YES on success
   1030  */
   1031 _MHD_EXTERN int
   1032 SPDY_name_value_add (struct SPDY_NameValue *container,
   1033                      const char *name,
   1034                      const char *value);
   1035 
   1036 
   1037 /**
   1038  * Lookup value for a name in a name/value structure.
   1039  *
   1040  * @param container structure in which to lookup
   1041  * @param name the name to look for
   1042  * @param num_values length of the returned array with values
   1043  * @return NULL if no such item was found, or an array containing the
   1044  * 			values
   1045  */
   1046 _MHD_EXTERN const char * const *
   1047 SPDY_name_value_lookup (struct SPDY_NameValue *container,
   1048                         const char *name,
   1049                         int *num_values);
   1050 
   1051 
   1052 /**
   1053  * Iterate over name/value structure.
   1054  *
   1055  * @param container structure which to iterate over
   1056  * @param iterator callback to call on each name/value pair;
   1057  *        maybe NULL (then just count headers)
   1058  * @param iterator_cls extra argument to @a iterator
   1059  * @return number of entries iterated over
   1060  */
   1061 _MHD_EXTERN int
   1062 SPDY_name_value_iterate (struct SPDY_NameValue *container,
   1063                          SPDY_NameValueIterator iterator,
   1064                          void *iterator_cls);
   1065 
   1066 
   1067 /**
   1068  * Destroy a NameValue structure. Use this function to destroy only
   1069  * objects which, after passed to, will not be destroied by other
   1070  * functions.
   1071  *
   1072  */
   1073 _MHD_EXTERN void
   1074 SPDY_name_value_destroy (struct SPDY_NameValue *container);
   1075 
   1076 
   1077 /* SPDY request handling functions */
   1078 
   1079 
   1080 /**
   1081  * Gets the session responsible for the given
   1082  * request.
   1083  *
   1084  * @param request for which the session is wanted
   1085  * @return session handler for the request
   1086  */
   1087 _MHD_EXTERN struct SPDY_Session *
   1088 SPDY_get_session_for_request (const struct SPDY_Request *request);
   1089 
   1090 
   1091 /**
   1092  * Associate a void pointer with a request. The data accessible by the
   1093  * pointer can later be used wherever the request handler is available.
   1094  *
   1095  * @param request with which to associate a pointer
   1096  * @param cls any data pointed by a pointer to be accessible later
   1097  */
   1098 _MHD_EXTERN void
   1099 SPDY_set_cls_to_request (struct SPDY_Request *request,
   1100                          void *cls);
   1101 
   1102 
   1103 /**
   1104  * Retrieves the pointer associated with the request by
   1105  * SPDY_set_cls_to_request().
   1106  *
   1107  * @param request to get its cls
   1108  * @return same pointer added by SPDY_set_cls_to_request() or
   1109  * 			NULL when nothing was associated
   1110  */
   1111 _MHD_EXTERN void *
   1112 SPDY_get_cls_from_request (struct SPDY_Request *request);
   1113 
   1114 
   1115 /* SPDY response handling functions */
   1116 
   1117 
   1118 /**
   1119  * Create response object containing all needed headers and data. The
   1120  * response object is not bound to a request, so it can be used multiple
   1121  * times with SPDY_queue_response() and schould be
   1122  * destroied by calling the SPDY_destroy_response().<p>
   1123  *
   1124  * Currently the library does not provide compression of the body data.
   1125  * It is up to the user to pass already compressed data and the
   1126  * appropriate headers to this function when desired.
   1127  *
   1128  * @param status HTTP status code for the response (e.g. 404)
   1129  * @param statustext HTTP status message for the response, which will
   1130  * 			be appended to the status code (e.g. "OK"). Can be NULL
   1131  * @param version HTTP version for the response (e.g. "http/1.1")
   1132  * @param headers name/value structure containing additional HTTP headers.
   1133  *                Can be NULL. Can be used multiple times, it is up to
   1134  *                the user to destoy the object when not needed anymore.
   1135  * @param data the body of the response. The lib will make a copy of it,
   1136  *             so it is up to the user to take care of the memory
   1137  *             pointed by data
   1138  * @param size length of @a data. It can be 0, then the lib will send only
   1139  * 				headers
   1140  * @return NULL on error, handle to response object on success
   1141  */
   1142 _MHD_EXTERN struct SPDY_Response *
   1143 SPDY_build_response (int status,
   1144                      const char *statustext,
   1145                      const char *version,
   1146                      struct SPDY_NameValue *headers,
   1147                      const void *data,
   1148                      size_t size);
   1149 
   1150 
   1151 /**
   1152  * Create response object containing all needed headers. The data will
   1153  * be provided later when the lib calls the callback function (just
   1154  * before writing it to the TLS socket). The
   1155  * response object is not bound to a request, so it can be used multiple
   1156  * times with SPDY_queue_response() and schould be
   1157  * destroied by calling the SPDY_destroy_response().<p>
   1158  *
   1159  * Currently the library does not provide compression of the body data.
   1160  * It is up to the user to pass already compressed data and the
   1161  * appropriate headers to this function and the callback when desired.
   1162  *
   1163  * @param status HTTP status code for the response (e.g. 404)
   1164  * @param statustext HTTP status message for the response, which will
   1165  * 			be appended to the status code (e.g. "OK"). Can be NULL
   1166  * @param version HTTP version for the response (e.g. "http/1.1")
   1167  * @param headers name/value structure containing additional HTTP headers.
   1168  *                Can be NULL. Can be used multiple times, it is up to
   1169  *                the user to destoy the object when not needed anymore.
   1170  * @param rcb callback to use to obtain response data
   1171  * @param rcb_cls extra argument to @a rcb
   1172  * @param block_size preferred block size for querying rcb (advisory only,
   1173  *                   the lib will call rcb specifying the block size); clients
   1174  *                   should pick a value that is appropriate for IO and
   1175  *                   memory performance requirements. The function will
   1176  *                   fail if the value is bigger than the maximum
   1177  *                   supported value (SPDY_MAX_SUPPORTED_FRAME_SIZE).
   1178  *                   Can be 0, then the lib will use
   1179  *                   #SPDY_MAX_SUPPORTED_FRAME_SIZE instead.
   1180  * @return NULL on error, handle to response object on success
   1181  */
   1182 _MHD_EXTERN struct SPDY_Response *
   1183 SPDY_build_response_with_callback(int status,
   1184                                   const char *statustext,
   1185                                   const char *version,
   1186                                   struct SPDY_NameValue *headers,
   1187                                   SPDY_ResponseCallback rcb,
   1188                                   void *rcb_cls,
   1189                                   uint32_t block_size);
   1190 
   1191 
   1192 /**
   1193  * Queue response object to be sent to the client. A successfully queued
   1194  * response may never be sent, e.g. when the stream gets closed. The
   1195  * data will be added to the output queue. The call will fail, if the
   1196  * output for this session
   1197  * is closed (i.e. the session is closed, half or full) or the output
   1198  * channel for the stream, on which the request was received, is closed
   1199  * (i.e. the stream is closed, half or full).
   1200  *
   1201  * @param request object identifying the request to which the
   1202  * 			response is returned
   1203  * @param response object containg headers and data to be sent
   1204  * @param closestream TRUE if the server does NOT intend to PUSH
   1205  * 			something more associated to this request/response later,
   1206  * 			FALSE otherwise
   1207  * @param consider_priority if FALSE, the response will be added to the
   1208  * 			end of the queue. If TRUE, the response will be added after
   1209  * 			the last previously added response with priority of the
   1210  * 			request grater or equal to that of the current one. This
   1211  * 			means that the function should be called with TRUE each time
   1212  * 			if one wants to be sure that the output queue behaves like
   1213  * 			a priority queue
   1214  * @param rrcb callback called when all the data was sent (last frame
   1215  * 			from response) or when that frame was discarded (e.g. the
   1216  * 			stream has been closed meanwhile)
   1217  * @param rrcb_cls extra argument to @a rrcb
   1218  * @return #SPDY_NO on error or #SPDY_YES on success
   1219  */
   1220 _MHD_EXTERN int
   1221 SPDY_queue_response (struct SPDY_Request *request,
   1222                      struct SPDY_Response *response,
   1223                      bool closestream,
   1224                      bool consider_priority,
   1225                      SPDY_ResponseResultCallback rrcb,
   1226                      void *rrcb_cls);
   1227 
   1228 
   1229 /**
   1230  * Destroy a response structure. It should be called for all objects
   1231  * returned by SPDY_build_response*() functions to free the memory
   1232  * associated with the prepared response. It is safe to call this
   1233  * function not before being sure that the response will not be used by
   1234  * the lib anymore, this means after SPDY_ResponseResultCallback
   1235  * callbacks were called for all calls to SPDY_queue_response() passing
   1236  * this response.
   1237  *
   1238  * @param response to destroy
   1239  */
   1240 _MHD_EXTERN void
   1241 SPDY_destroy_response (struct SPDY_Response *response);
   1242 
   1243 
   1244 /* SPDY settings ID/value data structure handling functions */
   1245 
   1246 
   1247 /**
   1248  * Create a new SettingsIDValue structure. It is needed for putting
   1249  * inside tuples of SPDY option, flags and value for sending to the
   1250  * client.
   1251  *
   1252  * @return hendler to the new empty structure or NULL on error
   1253  */
   1254 _MHD_EXTERN const struct SPDY_Settings *
   1255 SPDY_settings_create (void);
   1256 
   1257 
   1258 /**
   1259  * Add or update a tuple to a SettingsIDValue structure.
   1260  *
   1261  * @param container structure to which the new tuple is added
   1262  * @param id SPDY settings ID that will be sent. If this ID already in
   1263  *           container, the tupple for it will be updated (value and/or
   1264  *           flags). If it is not in the container, a new tupple will be
   1265  *           added.
   1266  * @param flags SPDY settings flags applied only to this setting
   1267  * @param value of the setting
   1268  * @return #SPDY_NO on error
   1269  * 			or #SPDY_YES if a new setting was added
   1270  */
   1271 _MHD_EXTERN int
   1272 SPDY_settings_add (struct SPDY_Settings *container,
   1273                    enum SPDY_SETTINGS id,
   1274                    enum SPDY_FLAG_SETTINGS flags,
   1275                    int32_t value);
   1276 
   1277 
   1278 /**
   1279  * Lookup value and flags for an ID in a settings ID/value structure.
   1280  *
   1281  * @param container structure in which to lookup
   1282  * @param id SPDY settings ID to search for
   1283  * @param flags out param for SPDY settings flags for this setting;
   1284  * 			check it against the flags in enum SPDY_FLAG_SETTINGS
   1285  * @param value out param for the value of this setting
   1286  * @return #SPDY_NO if the setting is not into the structure
   1287  * 			or #SPDY_YES if it is into it
   1288  */
   1289 _MHD_EXTERN int
   1290 SPDY_settings_lookup (const struct SPDY_Settings *container,
   1291                       enum SPDY_SETTINGS id,
   1292                       enum SPDY_FLAG_SETTINGS *flags,
   1293                       int32_t *value);
   1294 
   1295 
   1296 /**
   1297  * Iterate over settings ID/value structure.
   1298  *
   1299  * @param container structure which to iterate over
   1300  * @param iterator callback to call on each ID/value pair;
   1301  *        maybe NULL (then just count number of settings)
   1302  * @param iterator_cls extra argument to iterator
   1303  * @return number of entries iterated over
   1304  */
   1305 _MHD_EXTERN int
   1306 SPDY_settings_iterate (const struct SPDY_Settings *container,
   1307                        SPDY_SettingsIterator iterator,
   1308                        void *iterator_cls);
   1309 
   1310 
   1311 /**
   1312  * Destroy a settings ID/value structure. Use this function to destroy
   1313  * only objects which, after passed to, will not be destroied by other
   1314  * functions.
   1315  *
   1316  * @param container structure which to detroy
   1317  */
   1318 _MHD_EXTERN void
   1319 SPDY_settings_destroy (struct SPDY_Settings * container);
   1320 
   1321 
   1322 /* SPDY SETTINGS handling functions */
   1323 
   1324 
   1325 /**
   1326  * Send SPDY SETTINGS to the client. The call will return fail if there
   1327  * in invald setting into the settings container (e.g. invalid setting
   1328  * ID).
   1329  *
   1330  * @param session SPDY_Session handler for which settings are being sent
   1331  * @param settings ID/value pairs of the settings to be sent.
   1332  * 			Can be used multiple times, it is up to the user to destoy
   1333  * 			the object when not needed anymore.
   1334  * @param flags for the whole settings frame. They are valid for all tuples
   1335  * @param ... list of options (type-value pairs,
   1336  *        terminated with #SPDY_SETTINGS_OPTION_END).
   1337  * @return SPDY_NO on error or SPDY_YES on
   1338  * 			success
   1339  */
   1340 _MHD_EXTERN int
   1341 SPDY_send_settings (struct SPDY_Session *session,
   1342                     struct SPDY_Settings *settings,
   1343                     enum SPDY_FLAG_SETTINGS_FRAME flags,
   1344                     ...);
   1345 
   1346 
   1347 /* SPDY misc functions */
   1348 
   1349 
   1350 /**
   1351  * Destroy a request structure. It should be called for all objects
   1352  * received as a parameter in SPDY_NewRequestCallback to free the memory
   1353  * associated with the request. It is safe to call this
   1354  * function not before being sure that the request will not be used by
   1355  * the lib anymore, this means after the stream, on which this request
   1356  * had been sent, was closed and all SPDY_ResponseResultCallback
   1357  * callbacks were called for all calls to SPDY_queue_response() passing
   1358  * this request object.
   1359  *
   1360  * @param request to destroy
   1361  */
   1362 _MHD_EXTERN void
   1363 SPDY_destroy_request (struct SPDY_Request * request);
   1364 
   1365 
   1366 /**
   1367  * Send SPDY ping to the client
   1368  *
   1369  * @param session handler for which the ping request is sent
   1370  * @param rttcb callback called when ping response to the request is
   1371  * 			received
   1372  * @param rttcb_cls extra argument to @a rttcb
   1373  * @return #SPDY_NO on error or #SPDY_YES on success
   1374  */
   1375 _MHD_EXTERN int
   1376 SPDY_send_ping (struct SPDY_Session *session,
   1377                 SPDY_PingCallback rttcb,
   1378                 void *rttcb_cls);
   1379 
   1380 #endif
   1381