# Copyright 2013 Frederic Sevillano
# Copyright 2013 Jean-Philippe Caissy <jpcaissy@piji.ca>
# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+# Copyright 2014 Alexandre Terrasa <alexandre@moz-code.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# The header of this request
var header = new HashMap[String, String]
+ # The raw body of the request.
+ var body = ""
+
# The content of the cookie of this request
var cookie = new HashMap[String, String]
# The arguments passed with the POST or GET method (with a priority on POST)
var all_args = new HashMap[String, String]
+
+ # Returns argument `arg_name` in the request as a String
+ # or null if it was not found.
+ # Also cleans the String by trimming it.
+ # If the Strings happens to be empty after trimming,
+ # the method will return `null`
+ #
+ # NOTE: Prioritizes POST before GET
+ fun string_arg(arg_name: String): nullable String do
+ if not all_args.has_key(arg_name) then return null
+ var s = all_args[arg_name].trim
+ if s.is_empty then return null
+ return s
+ end
+
+ # Returns argument `arg_name` as an Int or `null` if not found or not a number.
+ #
+ # NOTE: Prioritizes POST before GET
+ fun int_arg(arg_name: String): nullable Int do
+ if not all_args.has_key(arg_name) then return null
+ var i = all_args[arg_name]
+ if not i.is_numeric then return null
+ return i.to_i
+ end
+
+ # Returns argument `arg_name` as a Bool or `null` if not found or not a boolean.
+ #
+ # NOTE: Prioritizes POST before GET
+ fun bool_arg(arg_name: String): nullable Bool do
+ if not all_args.has_key(arg_name) then return null
+ var i = all_args[arg_name]
+ if i == "true" then return true
+ if i == "false" then return false
+ return null
+ end
end
# Utility class to parse a request string and build a `HttpRequest`
# Words of the first line
private var first_line = new Array[String]
- init do end
-
fun parse_http_request(full_request: String): nullable HttpRequest
do
clear_data
# POST args
if http_request.method == "POST" then
+ http_request.body = body
var lines = body.split_with('&')
for line in lines do if not line.trim.is_empty then
var parts = line.split_once_on('=')
if parts.length > 1 then
var decoded = parts[1].replace('+', " ").from_percent_encoding
- if decoded == null then
- print "decode error"
- continue
- end
http_request.post_args[parts[0]] = decoded
http_request.all_args[parts[0]] = decoded
else