# 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.
# Provides the `HttpRequest` class and services to create it
module http_request
-import standard
+import core
+import serialization
# A request received over HTTP, is build by `HttpRequestParser`
class HttpRequest
- private init do end
+ serialize
+
+ private init is old_style_init do end
# HTTP protocol version
var http_version: String
# Method of this request (GET or POST)
var method: String
- # The host targetter by this request (usually the server)
- var host: String
-
# The full URL requested by the client (including the `query_string`)
var url: String
# 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]
return s
end
- # Returns argument `arg_name` as an Int or `null` if not found or not a number.
+ # Returns argument `arg_name` as an Int or `null` if not found or not an integer.
#
# 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
+ if not i.is_int then return null
return i.to_i
end
# Words of the first line
private var first_line = new Array[String]
- init do end
-
+ # Parse the `first_line`, `header_fields` and `body` of `full_request`.
fun parse_http_request(full_request: String): nullable HttpRequest
do
clear_data
var parse_url = parse_url
http_request.get_args = parse_url
- http_request.all_args.recover_with parse_url
+ http_request.all_args.add_all parse_url
else
http_request.uri = first_line[1]
end
# POST args
- if http_request.method == "POST" then
+ if http_request.method == "POST" or http_request.method == "PUT" 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
- print "POST Error: {line} format error on {line}"
end
end
end
for param in get_args do
var key_value = param.split_with("=")
if key_value.length < 2 then continue
- query_strings[key_value[0]] = key_value[1]
+
+ var key = key_value[0].from_percent_encoding
+ var value = key_value[1].from_percent_encoding
+ query_strings[key] = value
end
end