Provides the HttpResponse class and http_status_codes

Introduced classes

class HttpResponse

nitcorn :: HttpResponse

A response to send over HTTP
class HttpStatusCodes

nitcorn :: HttpStatusCodes

Helper class to associate HTTP status code to their message

Redefined classes

redef abstract class Deserializer

nitcorn :: http_response $ Deserializer

Abstract deserialization service
redef class Sys

nitcorn :: http_response $ Sys

The main class of the program.

All class definitions

redef abstract class Deserializer

nitcorn :: http_response $ Deserializer

Abstract deserialization service
class HttpResponse

nitcorn $ HttpResponse

A response to send over HTTP
class HttpStatusCodes

nitcorn $ HttpStatusCodes

Helper class to associate HTTP status code to their message
redef class Sys

nitcorn :: http_response $ Sys

The main class of the program.
package_diagram nitcorn::http_response http_response serialization serialization nitcorn::http_response->serialization template template nitcorn::http_response->template poset poset serialization->poset meta meta serialization->meta json json serialization->json core core template->core ...poset ... ...poset->poset ...meta ... ...meta->meta ...json ... ...json->json ...core ... ...core->core nitcorn::reactor reactor nitcorn::reactor->nitcorn::http_response nitcorn::sessions sessions nitcorn::sessions->nitcorn::http_response nitcorn::http_errors http_errors nitcorn::http_errors->nitcorn::http_response nitcorn::file_server file_server nitcorn::file_server->nitcorn::reactor nitcorn::file_server->nitcorn::sessions nitcorn::file_server->nitcorn::http_errors nitcorn::signal_handler signal_handler nitcorn::signal_handler->nitcorn::reactor nitcorn::log log nitcorn::log->nitcorn::reactor nitcorn::proxy proxy nitcorn::proxy->nitcorn::reactor nitcorn::file_server... ... nitcorn::file_server...->nitcorn::file_server nitcorn::signal_handler... ... nitcorn::signal_handler...->nitcorn::signal_handler nitcorn::log... ... nitcorn::log...->nitcorn::log nitcorn::proxy... ... nitcorn::proxy...->nitcorn::proxy

Ancestors

module abstract_collection

core :: abstract_collection

Abstract collection classes and services.
module abstract_text

core :: abstract_text

Abstract class for manipulation of sequences of characters
module array

core :: array

This module introduces the standard array structure.
module bitset

core :: bitset

Services to handle BitSet
module bytes

core :: bytes

Services for byte streams and arrays
module caching

serialization :: caching

Services for caching serialization engines
module circular_array

core :: circular_array

Efficient data structure to access both end of the sequence.
module codec_base

core :: codec_base

Base for codecs to use with streams
module codecs

core :: codecs

Group module for all codec-related manipulations
module collection

core :: collection

This module define several collection classes.
module core

core :: core

Standard classes and methods used by default by Nit programs and libraries.
module engine_tools

serialization :: engine_tools

Advanced services for serialization engines
module environ

core :: environ

Access to the environment variables of the process
module error

core :: error

Standard error-management infrastructure.
module exec

core :: exec

Invocation and management of operating system sub-processes.
module file

core :: file

File manipulations (create, read, write, etc.)
module fixed_ints

core :: fixed_ints

Basic integers of fixed-precision
module fixed_ints_text

core :: fixed_ints_text

Text services to complement fixed_ints
module flat

core :: flat

All the array-based text representations
module gc

core :: gc

Access to the Nit internal garbage collection mechanism
module hash_collection

core :: hash_collection

Introduce HashMap and HashSet.
module inspect

serialization :: inspect

Refine Serializable::inspect to show more useful information
module iso8859_1

core :: iso8859_1

Codec for ISO8859-1 I/O
module kernel

core :: kernel

Most basic classes and methods.
module list

core :: list

This module handle double linked lists
module math

core :: math

Mathematical operations
module meta

meta :: meta

Simple user-defined meta-level to manipulate types of instances as object.
module native

core :: native

Native structures for text and bytes
module numeric

core :: numeric

Advanced services for Numeric types
module protocol

core :: protocol

module queue

core :: queue

Queuing data structures and wrappers
module range

core :: range

Module for range of discrete objects.
module re

core :: re

Regular expression support for all services based on Pattern
module ropes

core :: ropes

Tree-based representation of a String.
module serialization_core

serialization :: serialization_core

Abstract services to serialize Nit objects to different formats
module sorter

core :: sorter

This module contains classes used to compare things and sorts arrays.
module stream

core :: stream

Input and output streams of characters
module text

core :: text

All the classes and methods related to the manipulation of text entities
module time

core :: time

Management of time and dates
module union_find

core :: union_find

union–find algorithm using an efficient disjoint-set data structure
module utf8

core :: utf8

Codec for UTF-8 I/O

Parents

module serialization

serialization :: serialization

General serialization services
module template

template :: template

Basic template system

Children

module http_errors

nitcorn :: http_errors

Offers ErrorTemplate to display error pages
module reactor

nitcorn :: reactor

Core of the nitcorn project, provides HttpFactory and Action
module sessions

nitcorn :: sessions

Automated session management

Descendants

module a_star-m

a_star-m

module api

nitc :: api

Components required to build a web server about the nit model.
module api_auth

nitc :: api_auth

module api_base

nitc :: api_base

Base classes used by nitweb.
module api_docdown

nitc :: api_docdown

Nitdoc specific Markdown format handling for Nitweb
module api_feedback

nitc :: api_feedback

Feedback related features
module api_light

nitc :: api_light

Highlight and collect messages from a piece of code
module api_model

nitc :: api_model

module example_angular

popcorn :: example_angular

This is an example of how to use angular.js with popcorn
module file_server

nitcorn :: file_server

Provides the FileServer action, which is a standard and minimal file server
module hooks

github :: hooks

Github hook event listening with nitcorn.
module htcpcp_server

nitcorn :: htcpcp_server

A server that implements HTCPCP. At the moment there are no additions.
module loader

github :: loader

module log

nitcorn :: log

Services inserting a timestamp in all prints and to log each requests
module nitcorn

nitcorn :: nitcorn

The nitcorn Web server framework creates server-side Web apps in Nit
module nitcorn_hello_world

nitcorn :: nitcorn_hello_world

Hello World Web server example
module nitcorn_reverse_proxy

nitcorn :: nitcorn_reverse_proxy

Minimal example using a ProxyAction
module nitweb

nitc :: nitweb

Runs a webserver based on nitcorn that render things from model.
module pop_auth

popcorn :: pop_auth

Authentification handlers.
module pop_handlers

popcorn :: pop_handlers

Route handlers.
module pop_json

popcorn :: pop_json

Introduce useful services for JSON REST API handlers.
module pop_routes

popcorn :: pop_routes

Internal routes representation.
module pop_sessions

popcorn :: pop_sessions

Session handlers
module pop_tasks

popcorn :: pop_tasks

Popcorn threaded tasks
module pop_templates

popcorn :: pop_templates

Template rendering for popcorn
module pop_tests

popcorn :: pop_tests

Popcorn testing services
module popcorn

popcorn :: popcorn

Application server abstraction on top of nitcorn.
module proxy

nitcorn :: proxy

Provides the ProxyAction action, which redirects requests to another interface
module pthreads

nitcorn :: pthreads

Activate the use of pthreads with nitcorn
module restful

nitcorn :: restful

Support module for the nitrestful tool and the restful annotation
module restful_annot

nitcorn :: restful_annot

Example for the restful annotation documented at lib/nitcorn/restful.nit
module signal_handler

nitcorn :: signal_handler

Handle SIGINT and SIGTERM to close the server after all active events
module simple_file_server

nitcorn :: simple_file_server

Basic file server on port 80 by default, may require root to execute
# Provides the `HttpResponse` class and `http_status_codes`
module http_response

import serialization
private import template

# A response to send over HTTP
class HttpResponse
	serialize

	# HTTP protocol version
	var http_version = "HTTP/1.0" is writable

	# Status code of this response (200, 404, etc.)
	var status_code: Int is writable

	# Return the message associated to `status_code`
	fun status_message: nullable String do return http_status_codes[status_code]

	# Headers of this response as a `Map`
	var header = new HashMap[String, String]

	# Body of this response
	var body: Writable = "" is writable

	# Files appended after `body`
	var files = new Array[String]

	# Finalize this response before sending it over HTTP
	fun finalize
	do
		# Set the content length if not already set
		if not header.keys.has("Content-Length") then
			# Size of the body
			var len
			var body = self.body
			if body isa Text then
				len = body.byte_length
			else if body isa Bytes then
				len = body.length
			else
				# We need the length, but there is no length in a writable.
				# So just render it as a bytes then measure :/
				body = body.write_to_bytes
				len = body.length
				# Keep the body as bytes since we have it
				self.body = body
			end

			# Size of included files
			for path in files do
				# TODO handle these error cases elsewhere, an error here will result in an invalid response
				if not path.file_exists then
					print_error "File does not exists at '{path}'"
					continue
				end

				var stat = path.file_stat
				if stat == null then
					print_error "Failed to stat file at '{path}'"
					continue
				end

				len += stat.size
			end

			# Set header
			header["Content-Length"] = len.to_s
		end

		# Set server ID
		if not header.keys.has("Server") then header["Server"] = "nitcorn"
	end

	# Get this reponse as a string according to HTTP protocol
	fun render: Writable
	do
		finalize

		var buf = new Template
		buf.add("{http_version} {status_code} {status_message or else ""}\r\n")
		for key, value in header do
			buf.add("{key}: {value}\r\n")
		end
		buf.add("\r\n")
		buf.add body
		return buf
	end
end

# Helper class to associate HTTP status code to their message
#
# You probably want the default instance available as the top-level method
# `http_status_codes`.
class HttpStatusCodes

	# All know code and their message
	var codes = new HashMap[Int, String]

	# Init the status `codes` list.
	protected init is old_style_init do insert_status_codes

	# Get the message associated to the status `code`, return `null` in unknown
	fun [](code: Int): nullable String
	do
		if codes.keys.has(code) then
			return codes[code]
		else return null
	end

	private fun insert_status_codes
	do
		codes[100] = "Continue"
		codes[101] = "Switching Protocols"
		codes[200] = "OK"
		codes[201] = "Created"
		codes[202] = "Accepted"
		codes[203] = "Non-Authoritative Information"
		codes[204] = "No Content"
		codes[205] = "Reset Content"
		codes[206] = "Partial Content"
		codes[300] = "Multiple Choices"
		codes[301] = "Moved Permanently"
		codes[302] = "Found"
		codes[303] = "See Other"
		codes[304] = "Not Modified"
		codes[305] = "Use Proxy"
		codes[307] = "Temporary Redirect"
		codes[400] = "Bad Request"
		codes[401] = "Unauthorized"
		codes[402] = "Payment Requred"
		codes[403] = "Forbidden"
		codes[404] = "Not Found"
		codes[405] = "Method Not Allowed"
		codes[406] = "Not Acceptable"
		codes[407] = "Proxy Authentication Required"
		codes[408] = "Request Timeout"
		codes[409] = "Conflict"
		codes[410] = "Gone"
		codes[411] = "Length Required"
		codes[412] = "Precondition Failed"
		codes[413] = "Request Entity Too Large"
		codes[414] = "Request-URI Too Long"
		codes[415] = "Unsupported Media Type"
		codes[416] = "Requested Range Not Satisfiable"
		codes[417] = "Expectation Failed"
		codes[500] = "Internal Server Error"
		codes[501] = "Not Implemented"
		codes[502] = "Bad Gateway"
		codes[503] = "Service Unavailable"
		codes[504] = "Gateway Timeout"
		codes[505] = "HTTP Version Not Supported"
	end
end

# Get the default instance of `HttpStatusCodes`
fun http_status_codes: HttpStatusCodes do return once new HttpStatusCodes

lib/nitcorn/http_response.nit:19,1--175,73