00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00057 #ifndef SPDY_MICROSPDY_H
00058 #define SPDY_MICROSPDY_H
00059
00060 #include <zlib.h>
00061 #include <stdbool.h>
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 #ifndef MHD_PLATFORM_H
00074 #include <unistd.h>
00075 #include <stdarg.h>
00076 #include <stdint.h>
00077 #ifdef __MINGW32__
00078 #include <ws2tcpip.h>
00079 #else
00080 #include <sys/time.h>
00081 #include <sys/types.h>
00082 #include <sys/socket.h>
00083 #endif
00084 #endif
00085
00086
00090 #define SPDY_YES 1
00091
00095 #define SPDY_NO 0
00096
00102 #define SPDY_INPUT_ERROR -1
00103
00107 #define SPDY_VERSION 3
00108
00114 #define SPDY_MAX_SUPPORTED_FRAME_SIZE 8192
00115
00119 #define SPDY_HTTP_CONTINUE 100
00120 #define SPDY_HTTP_SWITCHING_PROTOCOLS 101
00121 #define SPDY_HTTP_PROCESSING 102
00122
00123 #define SPDY_HTTP_OK 200
00124 #define SPDY_HTTP_CREATED 201
00125 #define SPDY_HTTP_ACCEPTED 202
00126 #define SPDY_HTTP_NON_AUTHORITATIVE_INFORMATION 203
00127 #define SPDY_HTTP_NO_CONTENT 204
00128 #define SPDY_HTTP_RESET_CONTENT 205
00129 #define SPDY_HTTP_PARTIAL_CONTENT 206
00130 #define SPDY_HTTP_MULTI_STATUS 207
00131
00132 #define SPDY_HTTP_MULTIPLE_CHOICES 300
00133 #define SPDY_HTTP_MOVED_PERMANENTLY 301
00134 #define SPDY_HTTP_FOUND 302
00135 #define SPDY_HTTP_SEE_OTHER 303
00136 #define SPDY_HTTP_NOT_MODIFIED 304
00137 #define SPDY_HTTP_USE_PROXY 305
00138 #define SPDY_HTTP_SWITCH_PROXY 306
00139 #define SPDY_HTTP_TEMPORARY_REDIRECT 307
00140
00141 #define SPDY_HTTP_BAD_REQUEST 400
00142 #define SPDY_HTTP_UNAUTHORIZED 401
00143 #define SPDY_HTTP_PAYMENT_REQUIRED 402
00144 #define SPDY_HTTP_FORBIDDEN 403
00145 #define SPDY_HTTP_NOT_FOUND 404
00146 #define SPDY_HTTP_METHOD_NOT_ALLOWED 405
00147 #define SPDY_HTTP_METHOD_NOT_ACCEPTABLE 406
00148 #define SPDY_HTTP_PROXY_AUTHENTICATION_REQUIRED 407
00149 #define SPDY_HTTP_REQUEST_TIMEOUT 408
00150 #define SPDY_HTTP_CONFLICT 409
00151 #define SPDY_HTTP_GONE 410
00152 #define SPDY_HTTP_LENGTH_REQUIRED 411
00153 #define SPDY_HTTP_PRECONDITION_FAILED 412
00154 #define SPDY_HTTP_REQUEST_ENTITY_TOO_LARGE 413
00155 #define SPDY_HTTP_REQUEST_URI_TOO_LONG 414
00156 #define SPDY_HTTP_UNSUPPORTED_MEDIA_TYPE 415
00157 #define SPDY_HTTP_REQUESTED_RANGE_NOT_SATISFIABLE 416
00158 #define SPDY_HTTP_EXPECTATION_FAILED 417
00159 #define SPDY_HTTP_UNPROCESSABLE_ENTITY 422
00160 #define SPDY_HTTP_LOCKED 423
00161 #define SPDY_HTTP_FAILED_DEPENDENCY 424
00162 #define SPDY_HTTP_UNORDERED_COLLECTION 425
00163 #define SPDY_HTTP_UPGRADE_REQUIRED 426
00164 #define SPDY_HTTP_NO_RESPONSE 444
00165 #define SPDY_HTTP_RETRY_WITH 449
00166 #define SPDY_HTTP_BLOCKED_BY_WINDOWS_PARENTAL_CONTROLS 450
00167 #define SPDY_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS 451
00168
00169 #define SPDY_HTTP_INTERNAL_SERVER_ERROR 500
00170 #define SPDY_HTTP_NOT_IMPLEMENTED 501
00171 #define SPDY_HTTP_BAD_GATEWAY 502
00172 #define SPDY_HTTP_SERVICE_UNAVAILABLE 503
00173 #define SPDY_HTTP_GATEWAY_TIMEOUT 504
00174 #define SPDY_HTTP_HTTP_VERSION_NOT_SUPPORTED 505
00175 #define SPDY_HTTP_VARIANT_ALSO_NEGOTIATES 506
00176 #define SPDY_HTTP_INSUFFICIENT_STORAGE 507
00177 #define SPDY_HTTP_BANDWIDTH_LIMIT_EXCEEDED 509
00178 #define SPDY_HTTP_NOT_EXTENDED 510
00179
00184 #define SPDY_HTTP_HEADER_ACCEPT "accept"
00185 #define SPDY_HTTP_HEADER_ACCEPT_CHARSET "accept-charset"
00186 #define SPDY_HTTP_HEADER_ACCEPT_ENCODING "accept-encoding"
00187 #define SPDY_HTTP_HEADER_ACCEPT_LANGUAGE "accept-language"
00188 #define SPDY_HTTP_HEADER_ACCEPT_RANGES "accept-ranges"
00189 #define SPDY_HTTP_HEADER_AGE "age"
00190 #define SPDY_HTTP_HEADER_ALLOW "allow"
00191 #define SPDY_HTTP_HEADER_AUTHORIZATION "authorization"
00192 #define SPDY_HTTP_HEADER_CACHE_CONTROL "cache-control"
00193
00194 #define SPDY_HTTP_HEADER_CONNECTION "connection"
00195 #define SPDY_HTTP_HEADER_CONTENT_ENCODING "content-encoding"
00196 #define SPDY_HTTP_HEADER_CONTENT_LANGUAGE "content-language"
00197 #define SPDY_HTTP_HEADER_CONTENT_LENGTH "content-length"
00198 #define SPDY_HTTP_HEADER_CONTENT_LOCATION "content-location"
00199 #define SPDY_HTTP_HEADER_CONTENT_MD5 "content-md5"
00200 #define SPDY_HTTP_HEADER_CONTENT_RANGE "content-range"
00201 #define SPDY_HTTP_HEADER_CONTENT_TYPE "content-type"
00202 #define SPDY_HTTP_HEADER_COOKIE "cookie"
00203 #define SPDY_HTTP_HEADER_DATE "date"
00204 #define SPDY_HTTP_HEADER_ETAG "etag"
00205 #define SPDY_HTTP_HEADER_EXPECT "expect"
00206 #define SPDY_HTTP_HEADER_EXPIRES "expires"
00207 #define SPDY_HTTP_HEADER_FROM "from"
00208
00209 #define SPDY_HTTP_HEADER_HOST "host"
00210 #define SPDY_HTTP_HEADER_IF_MATCH "if-match"
00211 #define SPDY_HTTP_HEADER_IF_MODIFIED_SINCE "if-modified-since"
00212 #define SPDY_HTTP_HEADER_IF_NONE_MATCH "if-none-match"
00213 #define SPDY_HTTP_HEADER_IF_RANGE "if-range"
00214 #define SPDY_HTTP_HEADER_IF_UNMODIFIED_SINCE "if-unmodified-since"
00215
00216 #define SPDY_HTTP_HEADER_KEEP_ALIVE "keep-alive"
00217 #define SPDY_HTTP_HEADER_LAST_MODIFIED "last-modified"
00218 #define SPDY_HTTP_HEADER_LOCATION "location"
00219 #define SPDY_HTTP_HEADER_MAX_FORWARDS "max-forwards"
00220 #define SPDY_HTTP_HEADER_PRAGMA "pragma"
00221 #define SPDY_HTTP_HEADER_PROXY_AUTHENTICATE "proxy-authenticate"
00222 #define SPDY_HTTP_HEADER_PROXY_AUTHORIZATION "proxy-authorization"
00223
00224 #define SPDY_HTTP_HEADER_PROXY_CONNECTION "proxy-connection"
00225 #define SPDY_HTTP_HEADER_RANGE "range"
00226 #define SPDY_HTTP_HEADER_REFERER "referer"
00227 #define SPDY_HTTP_HEADER_RETRY_AFTER "retry-after"
00228 #define SPDY_HTTP_HEADER_SERVER "server"
00229 #define SPDY_HTTP_HEADER_SET_COOKIE "set-cookie"
00230 #define SPDY_HTTP_HEADER_SET_COOKIE2 "set-cookie2"
00231 #define SPDY_HTTP_HEADER_TE "te"
00232 #define SPDY_HTTP_HEADER_TRAILER "trailer"
00233
00234 #define SPDY_HTTP_HEADER_TRANSFER_ENCODING "transfer-encoding"
00235 #define SPDY_HTTP_HEADER_UPGRADE "upgrade"
00236 #define SPDY_HTTP_HEADER_USER_AGENT "user-agent"
00237 #define SPDY_HTTP_HEADER_VARY "vary"
00238 #define SPDY_HTTP_HEADER_VIA "via"
00239 #define SPDY_HTTP_HEADER_WARNING "warning"
00240 #define SPDY_HTTP_HEADER_WWW_AUTHENTICATE "www-authenticate"
00241
00245 #define SPDY_HTTP_VERSION_1_0 "HTTP/1.0"
00246 #define SPDY_HTTP_VERSION_1_1 "HTTP/1.1"
00247
00251 #define SPDY_HTTP_METHOD_CONNECT "CONNECT"
00252 #define SPDY_HTTP_METHOD_DELETE "DELETE"
00253 #define SPDY_HTTP_METHOD_GET "GET"
00254 #define SPDY_HTTP_METHOD_HEAD "HEAD"
00255 #define SPDY_HTTP_METHOD_OPTIONS "OPTIONS"
00256 #define SPDY_HTTP_METHOD_POST "POST"
00257 #define SPDY_HTTP_METHOD_PUT "PUT"
00258 #define SPDY_HTTP_METHOD_TRACE "TRACE"
00259
00264 #define SPDY_HTTP_POST_ENCODING_FORM_URLENCODED "application/x-www-form-urlencoded"
00265 #define SPDY_HTTP_POST_ENCODING_MULTIPART_FORMDATA "multipart/form-data"
00266
00267
00271 struct SPDY_Daemon;
00272
00273
00277 struct SPDY_Session;
00278
00279
00284 struct SPDY_Request;
00285
00286
00292 struct SPDY_Response;
00293
00294
00299 struct SPDY_NameValue;
00300
00301
00306 struct SPDY_Settings;
00307
00308
00315 enum SPDY_IO_SUBSYSTEM
00316 {
00317
00321 SPDY_IO_SUBSYSTEM_NONE = 0,
00322
00326 SPDY_IO_SUBSYSTEM_OPENSSL = 1,
00327
00331 SPDY_IO_SUBSYSTEM_RAW = 2,
00332 };
00333
00334
00343 enum SPDY_DAEMON_OPTION
00344 {
00345
00350 SPDY_DAEMON_OPTION_END = 0,
00351
00357 SPDY_DAEMON_OPTION_SESSION_TIMEOUT = 1,
00358
00365 SPDY_DAEMON_OPTION_SOCK_ADDR = 2,
00366
00371 SPDY_DAEMON_OPTION_FLAGS = 4,
00372
00378 SPDY_DAEMON_OPTION_IO_SUBSYSTEM = 8,
00379
00390 SPDY_DAEMON_OPTION_MAX_NUM_FRAMES = 16,
00391 };
00392
00393
00398 enum SPDY_DAEMON_FLAG
00399 {
00403 SPDY_DAEMON_FLAG_NO = 0,
00404
00410 SPDY_DAEMON_FLAG_ONLY_IPV6 = 1,
00411
00416 SPDY_DAEMON_FLAG_NO_DELAY = 2,
00417 };
00418
00419
00424 enum SPDY_SETTINGS
00425 {
00426
00433 SPDY_SETTINGS_UPLOAD_BANDWIDTH = 1,
00434
00441 SPDY_SETTINGS_DOWNLOAD_BANDWIDTH = 2,
00442
00449 SPDY_SETTINGS_ROUND_TRIP_TIME = 3,
00450
00457 SPDY_SETTINGS_MAX_CONCURRENT_STREAMS = 4,
00458
00463 SPDY_SETTINGS_CURRENT_CWND = 5,
00464
00469 SPDY_SETTINGS_DOWNLOAD_RETRANS_RATE = 6,
00470
00475 SPDY_SETTINGS_INITIAL_WINDOW_SIZE = 7,
00476
00481 SPDY_SETTINGS_CLIENT_CERTIFICATE_VECTOR_SIZE = 8,
00482 };
00483
00484
00490 enum SPDY_FLAG_SETTINGS{
00491
00499 SPDY_FLAG_SETTINGS_PERSIST_VALUE = 1,
00500
00508 SPDY_FLAG_SETTINGS_PERSISTED = 2,
00509 };
00510
00511
00516 enum SPDY_FLAG_SETTINGS_FRAME
00517 {
00518
00528 SPDY_FLAG_SETTINGS_CLEAR_SETTINGS = 1,
00529 };
00530
00531
00541 enum SPDY_SETTINGS_OPTION
00542 {
00543
00548 SPDY_SETTINGS_OPTION_END = 0,
00549 };
00550
00551
00557 enum SPDY_RESPONSE_RESULT
00558 {
00559
00563 SPDY_RESPONSE_RESULT_SUCCESS = 0,
00564
00568 SPDY_RESPONSE_RESULT_SESSION_CLOSED = 1,
00569
00574 SPDY_RESPONSE_RESULT_STREAM_CLOSED = 2,
00575 };
00576
00586 typedef void
00587 (*SPDY_PanicCallback) (void * cls,
00588 const char * file,
00589 unsigned int line,
00590 const char * reason);
00591
00592
00600 typedef void
00601 (*SPDY_NewSessionCallback) (void * cls,
00602 struct SPDY_Session * session);
00603
00604
00617 typedef void
00618 (*SPDY_SessionClosedCallback) (void * cls,
00619 struct SPDY_Session * session,
00620 int by_client);
00621
00622
00632 typedef int
00633 (*SPDY_NameValueIterator) (void * cls,
00634 const char * name,
00635 const char * const * value,
00636 int num_values);
00637
00638
00664 typedef void (*SPDY_NewRequestCallback) (void * cls,
00665 struct SPDY_Request * request,
00666 uint8_t priority,
00667 const char * method,
00668 const char * path,
00669 const char * version,
00670 const char * host,
00671 const char * scheme,
00672 struct SPDY_NameValue * headers,
00673 bool more);
00674
00675
00691 typedef int
00692 (*SPDY_NewDataCallback) (void * cls,
00693 struct SPDY_Request *request,
00694 const void * buf,
00695 size_t size,
00696 bool more);
00697
00698
00699
00700
00701
00717 typedef ssize_t (*SPDY_ResponseCallback) (void * cls,
00718 void * buffer,
00719 size_t max,
00720 bool * more);
00721
00722
00745 typedef void
00746 (*SPDY_ResponseResultCallback) (void * cls,
00747 struct SPDY_Response * response,
00748 struct SPDY_Request * request,
00749 enum SPDY_RESPONSE_RESULT status,
00750 bool streamopened);
00751
00752
00760 typedef void
00761 (*SPDY_PingCallback) (void * cls,
00762 struct SPDY_Session * session,
00763 struct timeval * rtt);
00764
00765
00777 typedef int
00778 (*SPDY_SettingsIterator) (void * cls,
00779 enum SPDY_SETTINGS id,
00780 int32_t value,
00781 uint8_t flags);
00782
00783
00794 typedef void
00795 (*SPDY_SettingsReceivedCallback) (struct SPDY_Session * session,
00796 struct SPDY_Settings * settings,
00797 uint8_t flags,
00798 ...);
00799
00800
00801
00802
00803
00817 int
00818 (SPDY_init) (enum SPDY_IO_SUBSYSTEM io_subsystem, ...);
00819 #define SPDY_init() SPDY_init(SPDY_IO_SUBSYSTEM_OPENSSL)
00820
00821
00827 void
00828 SPDY_deinit ();
00829
00830
00846 void
00847 SPDY_set_panic_func (SPDY_PanicCallback cb,
00848 void *cls);
00849
00850
00851
00852
00853
00872 struct SPDY_Daemon *
00873 SPDY_start_daemon (uint16_t port,
00874 const char * certfile,
00875 const char * keyfile,
00876 SPDY_NewSessionCallback nscb,
00877 SPDY_SessionClosedCallback sccb,
00878 SPDY_NewRequestCallback nrcb,
00879 SPDY_NewDataCallback npdcb,
00880 void * cls,
00881 ...);
00882
00883
00890 void
00891 SPDY_stop_daemon (struct SPDY_Daemon *daemon);
00892
00893
00916 int
00917 SPDY_get_fdset (struct SPDY_Daemon * daemon,
00918 fd_set * read_fd_set,
00919 fd_set * write_fd_set,
00920 fd_set * except_fd_set);
00921
00922
00934 int
00935 SPDY_get_timeout (struct SPDY_Daemon * daemon,
00936 unsigned long long * timeout);
00937
00938
00945 void
00946 SPDY_run (struct SPDY_Daemon *daemon);
00947
00948
00949
00950
00951
00961 void
00962 SPDY_close_session(struct SPDY_Session * session);
00963
00964
00972 void
00973 SPDY_set_cls_to_session(struct SPDY_Session * session,
00974 void * cls);
00975
00976
00984 void *
00985 SPDY_get_cls_from_session(struct SPDY_Session * session);
00986
00987
00995 socklen_t
00996 SPDY_get_remote_addr(struct SPDY_Session * session,
00997 struct sockaddr ** addr);
00998
00999
01000
01001
01002
01010 struct SPDY_NameValue *
01011 SPDY_name_value_create ();
01012
01013
01024 int
01025 SPDY_name_value_add (struct SPDY_NameValue * container,
01026 const char * name,
01027 const char * value);
01028
01029
01039 const char * const *
01040 SPDY_name_value_lookup (struct SPDY_NameValue *container,
01041 const char *name,
01042 int * num_values);
01043
01044
01054 int
01055 SPDY_name_value_iterate (struct SPDY_NameValue *container,
01056 SPDY_NameValueIterator iterator,
01057 void *iterator_cls);
01058
01059
01066 void
01067 SPDY_name_value_destroy (struct SPDY_NameValue * container);
01068
01069
01070
01071
01072
01080 struct SPDY_Session *
01081 SPDY_get_session_for_request(const struct SPDY_Request * request);
01082
01083
01091 void
01092 SPDY_set_cls_to_request(struct SPDY_Request * request,
01093 void * cls);
01094
01095
01104 void *
01105 SPDY_get_cls_from_request(struct SPDY_Request * request);
01106
01107
01108
01109
01110
01135 struct SPDY_Response *
01136 SPDY_build_response(int status,
01137 const char * statustext,
01138 const char * version,
01139 struct SPDY_NameValue * headers,
01140 const void * data,
01141 size_t size);
01142
01143
01175 struct SPDY_Response *
01176 SPDY_build_response_with_callback(int status,
01177 const char * statustext,
01178 const char * version,
01179 struct SPDY_NameValue * headers,
01180 SPDY_ResponseCallback rcb,
01181 void *rcb_cls,
01182 uint32_t block_size);
01183
01184
01213 int
01214 SPDY_queue_response (struct SPDY_Request * request,
01215 struct SPDY_Response *response,
01216 bool closestream,
01217 bool consider_priority,
01218 SPDY_ResponseResultCallback rrcb,
01219 void * rrcb_cls);
01220
01221
01233 void
01234 SPDY_destroy_response (struct SPDY_Response *response);
01235
01236
01237
01238
01239
01247 const struct SPDY_Settings *
01248 SPDY_settings_create ();
01249
01250
01264 int
01265 SPDY_settings_add (struct SPDY_Settings *container,
01266 enum SPDY_SETTINGS id,
01267 enum SPDY_FLAG_SETTINGS flags,
01268 int32_t value);
01269
01270
01282 int
01283 SPDY_settings_lookup (const struct SPDY_Settings * container,
01284 enum SPDY_SETTINGS id,
01285 enum SPDY_FLAG_SETTINGS * flags,
01286 int32_t * value);
01287
01288
01298 int
01299 SPDY_settings_iterate (const struct SPDY_Settings * container,
01300 SPDY_SettingsIterator iterator,
01301 void * iterator_cls);
01302
01303
01311 void
01312 SPDY_settings_destroy (struct SPDY_Settings * container);
01313
01314
01315
01316
01317
01333 int
01334 SPDY_send_settings (struct SPDY_Session * session,
01335 struct SPDY_Settings * settings,
01336 enum SPDY_FLAG_SETTINGS_FRAME flags,
01337 ...);
01338
01339
01340
01341
01342
01355 void
01356 SPDY_destroy_request (struct SPDY_Request * request);
01357
01358
01368 int
01369 SPDY_send_ping(struct SPDY_Session * session,
01370 SPDY_PingCallback rttcb,
01371 void * rttcb_cls);
01372
01373 #endif