X-Git-Url: http://nitlanguage.org diff --git a/lib/nitcorn/http_request.nit b/lib/nitcorn/http_request.nit index 47e6823..f1135a5 100644 --- a/lib/nitcorn/http_request.nit +++ b/lib/nitcorn/http_request.nit @@ -3,6 +3,7 @@ # Copyright 2013 Frederic Sevillano # Copyright 2013 Jean-Philippe Caissy # Copyright 2014 Alexis Laferrière +# Copyright 2014 Alexandre Terrasa # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -19,11 +20,14 @@ # 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 @@ -31,9 +35,6 @@ class HttpRequest # 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 @@ -46,6 +47,9 @@ class HttpRequest # 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] @@ -72,13 +76,13 @@ class HttpRequest 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 @@ -110,8 +114,7 @@ class HttpRequestParser # 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 @@ -137,13 +140,14 @@ class HttpRequestParser 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('=') @@ -151,8 +155,6 @@ class HttpRequestParser var decoded = parts[1].replace('+', " ").from_percent_encoding 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 @@ -237,7 +239,10 @@ class HttpRequestParser 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