PageRenderTime 43ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/include/ewgi.hrl

http://github.com/skarab/ewgi
Erlang | 240 lines | 149 code | 34 blank | 57 comment | 0 complexity | 8ea41c5603499e2fc4f0c04d8f3e1ece MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception
  1. -ifndef(_EWGI_HRL).
  2. -define(_EWGI_HRL, 1).
  3. % ``The contents of this file are subject to the Mozilla Public License
  4. % Version 1.1 (the "License"); you may not use this file except in
  5. % compliance with the License. You may obtain a copy of the License at
  6. % http://www.mozilla.org/MPL/
  7. %
  8. % Software distributed under the License is distributed on an "AS IS"
  9. % basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  10. % License for the specific language governing rights and limitations
  11. % under the License.
  12. %
  13. % The Original Code is the EWGI reference implementation.
  14. %
  15. % The Initial Developer of the Original Code is S.G. Consulting
  16. % srl. Portions created by S.G. Consulting s.r.l. are Copyright (C)
  17. % 2007 S.G. Consulting srl. All Rights Reserved.
  18. %
  19. % Contributor(s): Filippo Pacini <filippo.pacini@gmail.com>
  20. % Hunter Morris <huntermorris@gmail.com>
  21. -define(DEFAULT_CHUNKSIZE, 4096).
  22. -type ewgi_propval() :: atom() | integer() | string() | binary().
  23. -type ewgi_prop() :: {ewgi_propval(), ewgi_propval()}.
  24. -type ewgi_proplist() :: [ewgi_prop()].
  25. %% @type bag() = gb_tree()
  26. -ifdef(HAS_GB_TREE_SPEC).
  27. -type bag() :: gb_tree().
  28. -else.
  29. -type bag() :: {non_neg_integer(), {any(), any(), any(), any()} | 'nil'}.
  30. -endif.
  31. %%% Note: Dialyzer currently doesn't support recursive types. When it does, this should change:
  32. %%%-type ewgi_ri_callback() :: fun(('eof' | {data, binary()}) -> iolist() | ewgi_ri_callback()).
  33. %% @type ewgi_ri_callback() = function()
  34. -type ewgi_ri_callback() :: fun(('eof' | {data, binary()}) -> iolist() | function()) | iolist().
  35. %% @type ewgi_read_input() = function()
  36. -type ewgi_read_input() :: fun((ewgi_ri_callback(), integer()) -> ewgi_ri_callback()).
  37. %% @type ewgi_write_error() = function()
  38. -type ewgi_write_error() :: fun((any()) -> 'ok').
  39. %% @type ewgi_version() = {integer(), integer()}
  40. -type ewgi_version() :: {integer(), integer()}.
  41. %% @type ewgi_spec() = {'ewgi_spec', function(), function(), string(),
  42. %% ewgi_version(), bag()}
  43. -type ewgi_spec() :: {'ewgi_spec', ewgi_read_input(),
  44. ewgi_write_error(), string(), ewgi_version(),
  45. bag()}.
  46. -define(IS_EWGI_SPEC(R), ((element(1, R) =:= 'ewgi_spec')
  47. and (size(R) =:= 6))).
  48. -define(GET_EWGI_READ_INPUT(R), element(2, R)).
  49. -define(SET_EWGI_READ_INPUT(A, R), setelement(2, R, A)).
  50. -define(GET_EWGI_WRITE_ERROR(R), element(3, R)).
  51. -define(SET_EWGI_WRITE_ERROR(A, R), setelement(3, R, A)).
  52. -define(GET_EWGI_URL_SCHEME(R), element(4, R)).
  53. -define(SET_EWGI_URL_SCHEME(A, R), setelement(4, R, A)).
  54. -define(GET_EWGI_VERSION(R), element(5, R)).
  55. -define(SET_EWGI_VERSION(A, R), setelement(5, R, A)).
  56. -define(GET_EWGI_DATA(R), element(6, R)).
  57. -define(SET_EWGI_DATA(A, R), setelement(6, R, A)).
  58. %% @type ewgi_header_val() = string() | 'undefined'
  59. -type ewgi_header_val() :: string() | 'undefined'.
  60. %% @type ewgi_header_key() = string()
  61. -type ewgi_header_key() :: string().
  62. %% @type ewgi_http_headers() = {'ewgi_http_headers',
  63. %% ewgi_header_val(),
  64. %% ewgi_header_val(),
  65. %% ewgi_header_val(),
  66. %% ewgi_header_val(),
  67. %% ewgi_header_val(),
  68. %% ewgi_header_val(),
  69. %% bag()}
  70. -type ewgi_http_headers() :: {'ewgi_http_headers', ewgi_header_val(),
  71. ewgi_header_val(), ewgi_header_val(),
  72. ewgi_header_val(), ewgi_header_val(),
  73. ewgi_header_val(), bag()}.
  74. -define(IS_HTTP_HEADERS(R), ((element(1, R) =:= 'ewgi_http_headers')
  75. and (size(R) =:= 8))).
  76. -define(GET_HTTP_ACCEPT(R), element(2, R)).
  77. -define(SET_HTTP_ACCEPT(A, R), setelement(2, R, A)).
  78. -define(GET_HTTP_COOKIE(R), element(3, R)).
  79. -define(SET_HTTP_COOKIE(A, R), setelement(3, R, A)).
  80. -define(GET_HTTP_HOST(R), element(4, R)).
  81. -define(SET_HTTP_HOST(A, R), setelement(4, R, A)).
  82. -define(GET_HTTP_IF_MODIFIED_SINCE(R), element(5, R)).
  83. -define(SET_HTTP_IF_MODIFIED_SINCE(A, R), setelement(5, R, A)).
  84. -define(GET_HTTP_USER_AGENT(R), element(6, R)).
  85. -define(SET_HTTP_USER_AGENT(A, R), setelement(6, R, A)).
  86. -define(GET_HTTP_X_HTTP_METHOD_OVERRIDE(R), element(7, R)).
  87. -define(SET_HTTP_X_HTTP_METHOD_OVERRIDE(A, R), setelement(7, R, A)).
  88. -define(GET_HTTP_OTHER(R), element(8, R)).
  89. -define(SET_HTTP_OTHER(A, R), setelement(8, R, A)).
  90. %% @type ewgi_request_method() = 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' |
  91. %% 'DELETE' | 'TRACE' | 'CONNECT' | string()
  92. -type ewgi_request_method() :: 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' |
  93. 'DELETE' | 'TRACE' | 'CONNECT' | string().
  94. %% @type ewgi_val() = string() | 'undefined'
  95. -type ewgi_val() :: string() | 'undefined'.
  96. %% @type ewgi_request() :: {'ewgi_request', ewgi_val(), integer(), ewgi_val(),
  97. %% ewgi_spec(), ewgi_val(), ewgi_http_headers(),
  98. %% ewgi_val(), ewgi_val(), ewgi_val(), ewgi_val(),
  99. %% ewgi_val(), ewgi_val(), ewgi_val(), ewgi_val(),
  100. %% ewgi_request_method(), ewgi_val(), ewgi_val(),
  101. %% ewgi_val(), ewgi_val(), ewgi_val()}
  102. -type ewgi_request() :: {'ewgi_request', ewgi_val(),
  103. non_neg_integer(), ewgi_val(), ewgi_spec(),
  104. ewgi_val(), ewgi_http_headers(), ewgi_val(),
  105. ewgi_val(), ewgi_val(), ewgi_val(),
  106. ewgi_val(), ewgi_val(), ewgi_val(),
  107. ewgi_val(), ewgi_request_method(),
  108. ewgi_val(), ewgi_val(), ewgi_val(),
  109. ewgi_val(), ewgi_val()}.
  110. -define(IS_EWGI_REQUEST(R), ((element(1, R) =:= 'ewgi_request')
  111. and (size(R) =:= 21))).
  112. -define(GET_AUTH_TYPE(R), element(2, R)).
  113. -define(SET_AUTH_TYPE(A, R), setelement(2, R, A)).
  114. -define(GET_CONTENT_LENGTH(R), element(3, R)).
  115. -define(SET_CONTENT_LENGTH(A, R), setelement(3, R, A)).
  116. -define(GET_CONTENT_TYPE(R), element(4, R)).
  117. -define(SET_CONTENT_TYPE(A, R), setelement(4, R, A)).
  118. -define(GET_EWGI(R), element(5, R)).
  119. -define(SET_EWGI(A, R), setelement(5, R, A)).
  120. -define(GET_GATEWAY_INTERFACE(R), element(6, R)).
  121. -define(SET_GATEWAY_INTERFACE(A, R), setelement(6, R, A)).
  122. -define(GET_HTTP_HEADERS(R), element(7, R)).
  123. -define(SET_HTTP_HEADERS(A, R), setelement(7, R, A)).
  124. -define(GET_PATH_INFO(R), element(8, R)).
  125. -define(SET_PATH_INFO(A, R), setelement(8, R, A)).
  126. -define(GET_PATH_TRANSLATED(R), element(9, R)).
  127. -define(SET_PATH_TRANSLATED(A, R), setelement(9, R, A)).
  128. -define(GET_QUERY_STRING(R), element(10, R)).
  129. -define(SET_QUERY_STRING(A, R), setelement(10, R, A)).
  130. -define(GET_REMOTE_ADDR(R), element(11, R)).
  131. -define(SET_REMOTE_ADDR(A, R), setelement(11, R, A)).
  132. -define(GET_REMOTE_HOST(R), element(12, R)).
  133. -define(SET_REMOTE_HOST(A, R), setelement(12, R, A)).
  134. -define(GET_REMOTE_IDENT(R), element(13, R)).
  135. -define(SET_REMOTE_IDENT(A, R), setelement(13, R, A)).
  136. -define(GET_REMOTE_USER(R), element(14, R)).
  137. -define(SET_REMOTE_USER(A, R), setelement(14, R, A)).
  138. -define(GET_REMOTE_USER_DATA(R), element(15, R)).
  139. -define(SET_REMOTE_USER_DATA(A, R), setelement(15, R, A)).
  140. -define(GET_REQUEST_METHOD(R), element(16, R)).
  141. -define(SET_REQUEST_METHOD(A, R), setelement(16, R, A)).
  142. -define(GET_SCRIPT_NAME(R), element(17, R)).
  143. -define(SET_SCRIPT_NAME(A, R), setelement(17, R, A)).
  144. -define(GET_SERVER_NAME(R), element(18, R)).
  145. -define(SET_SERVER_NAME(A, R), setelement(18, R, A)).
  146. -define(GET_SERVER_PORT(R), element(19, R)).
  147. -define(SET_SERVER_PORT(A, R), setelement(19, R, A)).
  148. -define(GET_SERVER_PROTOCOL(R), element(20, R)).
  149. -define(SET_SERVER_PROTOCOL(A, R), setelement(20, R, A)).
  150. -define(GET_SERVER_SOFTWARE(R), element(21, R)).
  151. -define(SET_SERVER_SOFTWARE(A, R), setelement(21, R, A)).
  152. %%% Note: Dialyzer currently doesn't support recursive types. When it does, this should change:
  153. %%%-type stream() :: fun(() -> {} | {any(), stream()}).
  154. %% @type stream() = function()
  155. -type stream() :: fun(() -> {} | {any(), function()}).
  156. %% @type ewgi_status() = {integer(), string()}
  157. -type ewgi_status() :: {integer(), string()}.
  158. %% @type ewgi_message_body() = binary() | iolist() | stream()
  159. -type ewgi_message_body() :: binary() | iolist() | stream().
  160. %% @type ewgi_header_list() = [{ewgi_header_key(), ewgi_header_val()}]
  161. -type ewgi_header_list() :: [{ewgi_header_key(), ewgi_header_val()}].
  162. %% @type ewgi_response() = {'ewgi_response', ewgi_status(),
  163. %% [{ewgi_header_key(), ewgi_header_val()}],
  164. %% ewgi_message_body(), any()}
  165. -type ewgi_response() :: {'ewgi_response', ewgi_status(), ewgi_header_list(), ewgi_message_body(), any()}.
  166. -define(IS_EWGI_RESPONSE(R), ((element(1, R) =:= 'ewgi_response')
  167. and (size(R) =:= 5))).
  168. -define(GET_RESPONSE_STATUS(R), element(2, R)).
  169. -define(SET_RESPONSE_STATUS(A, R), setelement(2, R, A)).
  170. -define(GET_RESPONSE_HEADERS(R), element(3, R)).
  171. -define(SET_RESPONSE_HEADERS(A, R), setelement(3, R, A)).
  172. -define(GET_RESPONSE_MESSAGE_BODY(R), element(4, R)).
  173. -define(SET_RESPONSE_MESSAGE_BODY(A, R), setelement(4, R, A)).
  174. -define(GET_RESPONSE_ERROR(R), element(5, R)).
  175. -define(SET_RESPONSE_ERROR(A, R), setelement(5, R, A)).
  176. %% @type ewgi_context() = {'ewgi_context', ewgi_request(), ewgi_response()}
  177. -type ewgi_context() :: {'ewgi_context', ewgi_request(), ewgi_response()}.
  178. -define(IS_EWGI_CONTEXT(R), ((element(1, R) =:= 'ewgi_context')
  179. and ?IS_EWGI_REQUEST(element(2, R))
  180. and ?IS_EWGI_RESPONSE(element(3, R))
  181. and (size(R) =:= 3))).
  182. -define(GET_EWGI_REQUEST(R), element(2, R)).
  183. -define(SET_EWGI_REQUEST(A, R), setelement(2, R, A)).
  184. -define(GET_EWGI_RESPONSE(R), element(3, R)).
  185. -define(SET_EWGI_RESPONSE(A, R), setelement(3, R, A)).
  186. %% @type ewgi_app() = function()
  187. -type ewgi_app() :: fun((ewgi_context()) -> ewgi_context()).
  188. -ifndef(debug).
  189. -define(INSPECT_EWGI_RESPONSE(Ctx), Ctx).
  190. -else.
  191. -define(INSPECT_EWGI_RESPONSE(Ctx),
  192. begin
  193. error_logger:info_msg("Inpecting the final ewgi_response()...~n"
  194. "Requested Url: ~p~n"
  195. "Status: ~p~n"
  196. "Headers: ~p~n"
  197. "Body: ~p~n",
  198. [ewgi_api:path_info(Ctx),
  199. ewgi_api:response_status(Ctx),
  200. ewgi_api:response_headers(Ctx),
  201. ewgi_api:response_message_body(Ctx)]),
  202. Ctx
  203. end
  204. ).
  205. -endif.
  206. -endif.