/library/server/httpd_connector/nino/src/httpd_nino_handler.e

http://github.com/jocelyn/EiffelWebReloaded · Specman e · 128 lines · 101 code · 21 blank · 6 comment · 7 complexity · ae41b00e62b552741b1d6a8aed6a646d MD5 · raw file

  1. note
  2. description : "Objects that ..."
  3. author : "$Author$"
  4. date : "$Date$"
  5. revision : "$Revision$"
  6. class
  7. HTTPD_NINO_HANDLER
  8. inherit
  9. HTTP_CONNECTION_HANDLER
  10. create
  11. make_with_callback
  12. feature {NONE} -- Initialization
  13. make_with_callback (a_main_server: like main_server; a_name: STRING; a_callback: HTTPD_NINO_APPLICATION)
  14. -- Initialize `Current'.
  15. do
  16. make (a_main_server, a_name)
  17. callback := a_callback
  18. end
  19. callback: HTTPD_NINO_APPLICATION
  20. feature -- Request processing
  21. process_request (a_handler: HTTP_CONNECTION_HANDLER; a_input: HTTP_INPUT_STREAM; a_output: HTTP_OUTPUT_STREAM)
  22. -- Process request ...
  23. local
  24. env, vars: HASH_TABLE [STRING, STRING]
  25. p: INTEGER
  26. l_request_uri, l_script_name, l_query_string: STRING
  27. l_server_name, l_server_port: detachable STRING
  28. a_headers_map: HASH_TABLE [STRING, STRING]
  29. e: EXECUTION_ENVIRONMENT
  30. do
  31. l_request_uri := a_handler.uri
  32. a_headers_map := a_handler.request_header_map
  33. create e
  34. vars := e.starting_environment_variables
  35. env := vars.twin
  36. p := l_request_uri.index_of ('?', 1)
  37. if p > 0 then
  38. l_script_name := l_request_uri.substring (1, p - 1)
  39. l_query_string := l_request_uri.substring (p + 1, l_request_uri.count)
  40. else
  41. l_script_name := l_request_uri.string
  42. l_query_string := ""
  43. end
  44. if attached a_headers_map.item ("Host") as l_host then
  45. add_environment_variable (l_host, "HTTP_HOST", env)
  46. p := l_host.index_of (':', 1)
  47. if p > 0 then
  48. l_server_name := l_host.substring (1, p - 1)
  49. l_server_port := l_host.substring (p+1, l_host.count)
  50. else
  51. l_server_name := l_host
  52. l_server_port := "80" -- Default
  53. end
  54. end
  55. add_environment_variable (a_headers_map.item ("User-Agent"), "HTTP_USER_AGENT", env)
  56. add_environment_variable (a_headers_map.item ("Accept"), "HTTP_ACCEPT", env)
  57. add_environment_variable (a_headers_map.item ("Accept-Language"), "HTTP_ACCEPT_LANGUAGE", env)
  58. add_environment_variable (a_headers_map.item ("Accept-Encoding"), "HTTP_ACCEPT_ENCODING", env)
  59. add_environment_variable (a_headers_map.item ("Accept-Charset"), "HTTP_ACCEPT_CHARSET", env)
  60. add_environment_variable (a_headers_map.item ("Connection"), "HTTP_CONNECTION", env)
  61. add_environment_variable (a_headers_map.item ("Referer"), "HTTP_REFERER", env)
  62. if attached a_headers_map.item ("Authorization") as l_authorization then
  63. add_environment_variable (l_authorization, "HTTP_AUTHORIZATION", env)
  64. p := l_authorization.index_of (' ', 1)
  65. if p > 0 then
  66. add_environment_variable (l_authorization.substring (1, p - 1), "AUTH_TYPE", env)
  67. end
  68. end
  69. add_environment_variable (a_headers_map.item ("Content-Length"), "CONTENT_LENGTH", env)
  70. add_environment_variable (a_headers_map.item ("Content-Type"), "CONTENT_TYPE", env)
  71. add_environment_variable ("CGI/1.1", "GATEWAY_INTERFACE", env)
  72. -- add_environment_variable (Void, "PATH_INFO", env)
  73. -- add_environment_variable (Void, "PATH_TRANSLATED", env)
  74. add_environment_variable (l_query_string, "QUERY_STRING", env)
  75. if attached a_handler.remote_info as l_remote_info then
  76. add_environment_variable (l_remote_info.addr, "REMOTE_ADDR", env)
  77. add_environment_variable (l_remote_info.hostname, "REMOTE_HOST", env)
  78. add_environment_variable (l_remote_info.port.out, "REMOTE_PORT", env)
  79. -- add_environment_variable (Void, "REMOTE_IDENT", env)
  80. -- add_environment_variable (Void, "REMOTE_USER", env)
  81. end
  82. add_environment_variable (l_request_uri, "REQUEST_URI", env)
  83. add_environment_variable (a_handler.method, "REQUEST_METHOD", env)
  84. add_environment_variable (l_script_name, "SCRIPT_NAME", env)
  85. add_environment_variable (l_server_name, "SERVER_NAME", env)
  86. add_environment_variable (l_server_port, "SERVER_PORT", env)
  87. add_environment_variable (a_handler.version, "SERVER_PROTOCOL", env)
  88. add_environment_variable ({HTTP_SERVER_CONFIGURATION}.Server_details, "SERVER_SOFTWARE", env)
  89. callback.process_request (env, a_handler.request_header, a_input, a_output)
  90. end
  91. add_environment_variable (a_value: detachable STRING; a_var_name: STRING; env: HASH_TABLE [STRING, STRING])
  92. do
  93. if a_value /= Void then
  94. env.force (a_value, a_var_name)
  95. end
  96. end
  97. note
  98. copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
  99. license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
  100. source: "[
  101. Eiffel Software
  102. 5949 Hollister Ave., Goleta, CA 93117 USA
  103. Telephone 805-685-1006, Fax 805-685-6869
  104. Website http://www.eiffel.com
  105. Customer support http://support.eiffel.com
  106. ]"
  107. end