diff --git a/Gemfile b/Gemfile index 053c27dc..37f5eaa4 100644 --- a/Gemfile +++ b/Gemfile @@ -1,2 +1,2 @@ source 'https://rubygems.org' -gem 'github-pages' +gem 'github-pages', group: :jekyll_plugins diff --git a/_config.yml b/_config.yml index c435af84..9e81c070 100644 --- a/_config.yml +++ b/_config.yml @@ -7,9 +7,9 @@ permalink: pretty # Server destination: ./_gh_pages -exclude: [".gitignore", "Gruntfile.js", "package.json", "node_modules", "README.md", "server_architecture.png", "wiki.py"] +exclude: [".gitignore", "Gruntfile.js", "package.json", "node_modules", "/README.md", "*.py", "*.png"] port: 9000 # Custom vars repo: https://github.com/EiffelWebFramework/EWF -download: https://github.com/EiffelWebFramework/EWF/archive/v0.4.0.zip +download: https://github.com/EiffelWebFramework/EWF/archive/v1.0.3.zip diff --git a/_layouts/default.html b/_layouts/default.html index 39b5dbf1..80045cbc 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -28,10 +28,7 @@ Community
git clone git://github.com/EiffelWebFramework/EWF.git
-
-== Hello World ==
-The hello world example is located in the directory $ISE_EIFFEL/contrib/examples/web/ewf/simple. Just double click on the simple.ecf file and select the simple target or if you prefer the command line, run the command:
-estudio -config simple.ecf -target simple
-
-Once the project is compiled, we will adapt the root class to point to port number 9090.
-
-'''Note''': By default, the application listens on port 80, which is often already used by standard webservers (Apache, nginx, ...). Moreover, on Linux, ports below 1024 can only be opened by root.
-
-To do this, we will redefine the feature initialize as follows:
-
-
- class
- APPLICATION
-
- inherit
- WSF_DEFAULT_SERVICE
- redefine
- initialize
- end
-
- create
- make_and_launch
-
- feature {NONE} -- Initialization
-
- initialize
- -- Initialize current service
- do
- set_service_option ("port", 9090)
- end
- end
-
-
-After one more compile, you can now launch the application and point your browser to [http://localhost:9090].
-You should now see a simple page with Hello World.
diff --git a/wiki/Doc_Index.mediawiki b/wiki/Doc_Index.mediawiki
deleted file mode 100644
index 9f195ef9..00000000
--- a/wiki/Doc_Index.mediawiki
+++ /dev/null
@@ -1,7 +0,0 @@
-Menu :: [[Doc_Getting_Started.mediawiki|Getting Started]] :: [[community.md|Community]]
-
-= Eiffel Web Framework =
-Framework to build web applications in Eiffel
-
-[ [http://github.com/EiffelWebFramework/EWF/zipball/ Download Current] ]
-[ [http://github.com/EiffelWebFramework/EWF/zipball/release-0.3 Download v0.3] ]
diff --git a/wiki/EWSGI/Open-Questions.md b/wiki/EWSGI/Open-Questions.md
deleted file mode 100644
index 3a56db0b..00000000
--- a/wiki/EWSGI/Open-Questions.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-layout: default
-title: Open Questions
-base_url: ../../
----
-## STRING_32, UTF-8, ... ? ##
-Berend raised the point that using STRING_32 is consuming 4 times the space used for STRING_8.
-And CPU is cheaper than memory, so we should try to use as less memory as possible.
-And then for Berend, STRING_32 is not the solution.
-
-Most of the data are just STRING_8 in CGI
-so let's list the various request data
-
-- **query_parameter** (from the query string ?foo=bar&extra=blabla )
- in this case, I think the name can be url-encoded, and obviously the value too
- I guess it makes sense to url-decode them
- but on the other hand, we could just keep them url-encoded (as they are), and it is up to the application to url-decode them if needed.
- Of course, we should provide facilities to url-decode those strings.
-
-- **form_data_parameter** (from the POST method)
- quite often, it is same kind of content that `parameters'
- but .. here this might depends on the encoding for multi-parts encoding.
-
-- **meta_variable** (from the request itself ... CGI meta variables..)
- I am wondering about unicode domain name ...
-
-- **input data** ...
- I think this is up to the application
-
-... to be continued ...
diff --git a/wiki/EWSGI/README.md b/wiki/EWSGI/README.md
deleted file mode 100644
index 20213cd2..00000000
--- a/wiki/EWSGI/README.md
+++ /dev/null
@@ -1,77 +0,0 @@
----
-layout: default
-title: README
-base_url: ../../
----
-- See proposed specifications: [EWSGI specification](EWSGI-specification.md)
-- See [Open questions](EWSGI-Open-Questions.md)
-- And below the various proposals and associated decision
-
-----
-# Waiting for decision
-
-## Include EWF_HEADER into EWSGI as WGI_HEADERS
-- Code: **P-2011-09-26-include-wgi-headers**
-- Status: proposed on 2011-09-26 **WAITING FOR APPROVAL**
-
-> Include WGI_HEADERS to help the user to build HTTP Header.
-> So that he doesn't have to know the HTTP specification for usual needs
-
-
-----
-# Adopted entries
-
-## Rename `parameter` into `item`
-- Code: **P-2011-09-07-renaming_REQUEST_item**
-- Status: proposed on 2011-09-07 **ADOPTED-by-default**
-
-> rename `{REQUEST}.parameter (n: READABLE_STRING_GENERAL): detachable WGI_VALUE`
-> into `{REQUEST}.item (n: READABLE_STRING_GENERAL): detachable WGI_VALUE`
-> and similar for `parameters` -> `items`
-
-## Return type of `parameter' (and similar query_, form_data_ ...) should be deferred WGI_VALUE
-- Code: **P-2011-09-05-WGI_VALUE**
-- Status: proposed on 2011-09-05 **ADOPTED-by-default**
-
-> Instead of returning just `READABLE_STRING_32` , it would be better to use **WGI_VALUE** .
-> Mainly to address the multiple value for the same param name, but also for uploaded files.
-> This allows to have various types such as WGI_STRING_VALUE, WGI_LIST_VALUE, WGI_TABLE_VALUE, WGI_FILE_VALUE .
->
-> Thus we would have: parameter (a_name: READABLE_STRING_GENERAL): detachable WGI_VALUE
-
-## Include the parameter's name in WGI_VALUE interface
-- Code: **P-2011-09-05-WGI_VALUE_interface**
-- Dependence: adoption of P-2011-09-05-WGI_VALUE , may impact on P-2011-09-05-parameters_ITERABLE
-- Status: proposed on 2011-09-05 **ADOPTED-by-default**
-
-> include the corresponding parameter's name in WGI_VALUE interface.
-> Such as `{WGI_VALUE}.name: READABLE_STRING_GENERAL` (or READABLE_STRING_32).
->
-> This would also allow to replace
-> signature `parameters: ITERABLE [TUPLE [name: READABLE_STRING_GENERAL; value: WGI__VALUE]]'
-> by a nicer signature `parameters: ITERABLE [WGI__VALUE]`
-
-## Signature of parameters (and similar) using ITERABLE [...]
-- Code: **P-2011-09-05-parameters_ITERABLE**
-- Status: proposed on 2011-09-05 **ADOPTED-by-default**
-
-> Description: Instead of forcing the implementation to use HASH_TABLE, DS_HASH_TABLE, DS_HASH_SET, ... or similar
-> we should use `ITERABLE`
->
-> `parameters: ITERABLE [TUPLE [name: READABLE_STRING_GENERAL; value: WGI_VALUE]]`
->
-> Or, if `P-2011-09-05-WGI_VALUE_interface` is adopted (WGI_VALUE.name holds the related parameter's name)
->
-> `parameters: ITERABLE [WGI_VALUE]`
-
-## Change prefix from EWSGI_ to WGI_
-- Code: **P-2011-08-29-WGI_prefix**
-- Status: **adopted**
-- Decision: **WGI_**
-
-> shorter and pronouncable prefix for EWSGI class names
-
-----
-# Rejected entries
-
-...
diff --git a/wiki/EWSGI/specification---difference-in-main-proposals.md b/wiki/EWSGI/specification---difference-in-main-proposals.md
deleted file mode 100644
index a633a495..00000000
--- a/wiki/EWSGI/specification---difference-in-main-proposals.md
+++ /dev/null
@@ -1,110 +0,0 @@
----
-layout: default
-title: specification difference in main proposals
-base_url: ../../
----
-Currently the **design of the EWSGI** is not going very fast, mainly due to conflicts for the core design.
-
-Let's try to summary today's **points of conflict** between Paul's proposal, and Jocelyn's proposal.
-Since Paul put the specification on the wiki from Seibo Solution Studio,
-and Jocelyn is implementing the proposal withing the current Eiffel Web Framework.
-(If other proposals are provided, we'll compare them to those 2 existing proposals.)
-
-Let's name the **Seibo-EWSGI** proposal and the **EWF-EWSGI** proposal.
-
-Of course, **the goal is to have only one specification**, but it is good to have more than one proposal. So that we really try to specify the best EWSGI as possible.
-
-Let's remind that EWSGI is meant to be a specification, and we are looking at **Specification-Compliance** for the future implementation (so this is mainly about class names, and feature signatures. I.e the Eiffel system interface).
-
-_Note_: to make the code shorter, we will not always include the prefix EWSGI_ to the class name.
-_Note2_: we will use the term of "user" for the developer using the EWSGI specification and/or implementation(s)
-
-## General goal ##
-At first, the main difference between Seibo-EWSGI and EWF-EWSGI is a tiny nuance on the general goal.
-_Seibo-EWSGI_: get web application portability across a variety of web servers.
-_EWF-EWSGI_: get web application portability across a variety of web servers including connectors.
-
-Both are following the CGI specification.
-
-To resume, the goal is to get an Eiffel Web ecosystem based on EWSGI specification which allow to write components, libraries, applications based on EWSGI, and which can be compiled and used without changes on the various EWSGI implementations.
-EWF-EWSGI is also targetting to make the connector implementations portable on the various EWSGI implementation. However this is not the most critical point, and could be address in later specification version, or maybe a specific EWSGI/Connector specification ...
-
-**Conclusion**: the general goal is (merely) the same for both proposals.
-That is a good point, otherwise no need to compare the 2 proposals
-
-## Main entry point for a Web application component ##
-This is the first important difference in the class EWSGI_APPLICATION
-
-Seibo-EWSGI:
-
- response (request: EWSGI_REQUEST): EWSGI_RESPONSE is
- -- The response to the given 'request'.
- deferred
- ensure
- Result.status_is_set
- Result.ready_to_transmit
- end
-
-EWF-EWSGI:
-
- execute (req: EWSGI_REQUEST; res: EWSGI_RESPONSE_BUFFER)
- -- Execute the request
- -- See `req.input' for input stream
- -- `req.environment' for the Gateway environment
- -- and `res' for the output buffer
- require
- res_status_unset: not res.status_is_set
- deferred
- ensure
- res_status_set: res.status_is_set
- end
-
-So the main difference is for the user/developer
-Seibo-EWSGI: the user has to create the RESPONSE object.
-EWF-EWSGI: the user has the RESPONSE_BUFFER object passed as argument, and it is ready to use.
-
-The consequences are important because
-
-* Seibo-EWSGI:
-
- - to make the creation of RESPONSE simple, the decision was to remove any notion of output stream in EWSGI.
- - Then the RESPONSE has to be built before sending it. But the proposal also provides a way to get the response message by block during the transmission. A kind of delay RESPONSE filling which is for now using a read_block pattern. And this mimics the send immediately the message parts to the client.
- - This design allows the developer to use its own descendant of RESPONSE and then implement the "read_block" pattern when needed.
- - This also allows to control carefully that the status+headers are sent before the body. And if not using the read_block pattern, this allows to set/change the headers even after setting the message body, in fact you really build the Response as an object, and you set the various attributes whenever you want.
- - The read_block pattern is meant to address the case where the message would be too big to stay in memory, and/or to send some part immediately to the client, but for that you must stick to the read_block pattern.
- - Seibo team find the Response-as-Result design more natural, and adopt the Request/Response model of HTTP protocol
-
-* EWF-EWSGI:
-
- - the RESPONSE_BUFFER is passed by argument to the user, then he does not have to worry about how to create it.
- - it is a buffer and could be implemented in various way by the implementation(s) to access the output stream if any
- - For now, there is no easy way for the user, from the proposed specification, to have a customized RESPONSE_BUFFER
- - It is easy to implement the Seibo-EWSGI design on top of EWF-EWSGI (the code is provided in EWF-ewsgi implementation)
- - the buffer specification allows the user to send the message parts immediately to the client without complicated pattern. As today implementation, the only restriction imposed by the design is to pass the Status code, and the headers before starting sending the message parts; this is checked by the associated assertions. However this part might be thinked again, to be more flexible, and let this to the responsibility of the user, or of other frameworks built on top of EWSGI spec.
-
-## Notion of output stream ##
-
-As you might noticed
-In EWF-EWSGI, the output stream is kind of hidden and replaced by the output buffer, which is in fact quite similar. However the goal is to allow the user to send immediately the message parts to the client as simple as writing in the buffer.
-The EWSGI implementation will handle this buffer to integrate nicely with the underlying web server techno. This will be done through the implementation of the various connectors.
-
-In Seibo-EWSGI there is NO notion of output stream, this is to handle the potential case of a HTTP server technologies following CGI specification but without any output stream.
-The read_block pattern allows the user to send a big response part by part, and/or also send some message parts immediately to the client during the transmission, this looks like a delayed computation of the messages.
-
----
-So for now, those are the main critical (blocking) differences I (Jocelyn) can see.
-
-## Personal point of views ##
-
-(Feel free to add your own point of view)
-
-### Jocelyn ###
-
-* I prefer the EWF-EWSGI solution (obviously this is my proposal) mainly because with it, you can also implement the Seibo-EWSGI design. And the "more you can do, the less you can also do".
-* I find the read_block pattern really not natural to use in non trivial application (even in trivial application, this might not be that easy to handle, and thus a potential source of bugs)
-* I admit the need to send immediately to the client might not be the vast majority of cases. But this is useful for big messages, and for long computing message where the client wants to follow the progression (concrete cases: drupal batch, wordpress online update, ...)
-* I would prefer to include the connector part into the EWSGI specification, this way any EWSGI_connector implementation could work with any EWSGI implementation. Otherwise we might end up with many different EWSGI implementations, and according to the underlying connector(s) you want to use, you will need to use different EWSGI implementations.
-
-### Others ... ? ###
-Please contribute ... correct also the wiki page if there are mistake or misunderstanding.
-
diff --git a/wiki/EWSGI/specification.md b/wiki/EWSGI/specification.md
deleted file mode 100644
index fc785bd5..00000000
--- a/wiki/EWSGI/specification.md
+++ /dev/null
@@ -1,793 +0,0 @@
----
-layout: default
-title: specification
-base_url: ../../
----
-**WARNING** **THIS PAGE IS IN PROGRESS, AS IT IS NOW, IT NEEDS UPDATE SINCE IT DOES NOT REFLECT THE FUTURE INTERFACE**
-
-# The Eiffel Web Server Gateway Interface
-## Preface
-This specification is a proposition based on recent discussion on the mailing list.
-This is work in progress, so far nothing had been decided.
-You can find another proposal at [http://eiffel.seibostudios.se/wiki/EWSGI](http://eiffel.seibostudios.se/wiki/EWSGI) , it has common background and goal, however still differ on specific parts.
-The main goal for now is to unified those 2 specifications.
-
----
-Note the following is work in progress, and reflect a specification proposal, rather than the final specification.
-2011-08-01
----
-For now, the specification from EWF is done in Eiffel interface
-please see: [https://github.com/Eiffel-World/Eiffel-Web-Framework/tree/master/library/server/ewsgi/specification](https://github.com/Eiffel-World/Eiffel-Web-Framework/tree/master/library/server/ewsgi/specification)
-
-WGI_APPLICATION
-
- deferred class
- WGI_APPLICATION
-
- feature {NONE} -- Execution
-
- execute (req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
- -- Execute the request
- -- See `req.input' for input stream
- -- `req.meta_variables' for the CGI meta variable
- -- and `res' for the output buffer
- require
- res_status_unset: not res.status_is_set
- deferred
- ensure
- res_status_set: res.status_is_set
- end
-
- end
-
-WGI_REQUEST
-
- deferred class
- WGI_REQUEST
-
- feature -- Access: Input
-
- input: WGI_INPUT_STREAM
- -- Server input channel
- deferred
- end
-
- feature -- Access: extra values
-
- request_time: detachable DATE_TIME
- -- Request time (UTC)
- deferred
- end
-
- feature -- Access: CGI meta variables
-
- meta_variable (a_name: READABLE_STRING_GENERAL): detachable WGI_VALUE
- -- Environment variable related to `a_name'
- require
- a_name_valid: a_name /= Void and then not a_name.is_empty
- deferred
- end
-
- meta_string_variable (a_name: READABLE_STRING_GENERAL): detachable READABLE_STRING_32
- -- Environment variable related to `a_name'
- require
- a_name_valid: a_name /= Void and then not a_name.is_empty
- do
- if attached meta_variable (a_name) as val then
- Result := val.as_string
- end
- end
-
- meta_variables: ITERABLE [WGI_VALUE]
- -- These variables are specific to requests made with HTTP.
- -- Interpretation of these variables may depend on the value of
- -- SERVER_PROTOCOL.
- --
- -- Environment variables with names beginning with "HTTP_" contain
- -- header data read from the client, if the protocol used was HTTP.
- -- The HTTP header name is converted to upper case, has all
- -- occurrences of "-" replaced with "_" and has "HTTP_" prepended to
- -- give the environment variable name. The header data may be
- -- presented as sent by the client, or may be rewritten in ways which
- -- do not change its semantics. If multiple headers with the same
- -- field-name are received then they must be rewritten as a single
- -- header having the same semantics. Similarly, a header that is
- -- received on more than one line must be merged onto a single line.
- -- The server must, if necessary, change the representation of the
- -- data (for example, the character set) to be appropriate for a CGI
- -- environment variable.
- --
- -- The server is not required to create environment variables for all
- -- the headers that it receives. In particular, it may remove any
- -- headers carrying authentication information, such as
- -- "Authorization"; it may remove headers whose value is available to
- -- the script via other variables, such as "Content-Length" and
- -- "Content-Type".
- --
- -- For convenience it might also include the following CGI entries
- deferred
- end
-
- feature -- Common Gateway Interface - 1.1 8 January 1996
-
- auth_type: detachable READABLE_STRING_32
- -- This variable is specific to requests made via the "http"
- -- scheme.
- --
- -- If the Script-URI required access authentication for external
- -- access, then the server MUST set the value of this variable
- -- from the 'auth-scheme' token in the request's "Authorization"
- -- header field. Otherwise it is set to NULL.
- --
- -- AUTH_TYPE = "" | auth-scheme
- -- auth-scheme = "Basic" | "Digest" | token
- --
- -- HTTP access authentication schemes are described in section 11
- -- of the HTTP/1.1 specification [8]. The auth-scheme is not
- -- case-sensitive.
- --
- -- Servers MUST provide this metavariable to scripts if the
- -- request header included an "Authorization" field that was
- -- authenticated.
- deferred
- end
-
- content_length: detachable READABLE_STRING_32
- -- This metavariable is set to the size of the message-body
- -- entity attached to the request, if any, in decimal number of
- -- octets. If no data are attached, then this metavariable is
- -- either NULL or not defined. The syntax is the same as for the
- -- HTTP "Content-Length" header field (section 14.14, HTTP/1.1
- -- specification [8]).
- --
- -- CONTENT_LENGTH = "" | 1*digit
- --
- -- Servers MUST provide this metavariable to scripts if the
- -- request was accompanied by a message-body entity.
- deferred
- end
-
- content_length_value: NATURAL_64
- -- Integer value related to `content_length"
- deferred
- end
-
- content_type: detachable READABLE_STRING_32
- -- If the request includes a message-body, CONTENT_TYPE is set to
- -- the Internet Media Type [9] of the attached entity if the type
- -- was provided via a "Content-type" field in the request header,
- -- or if the server can determine it in the absence of a supplied
- -- "Content-type" field. The syntax is the same as for the HTTP
- -- "Content-Type" header field.
- --
- -- CONTENT_TYPE = "" | media-type
- -- media-type = type "/" subtype *( ";" parameter)
- -- type = token
- -- subtype = token
- -- parameter = attribute "=" value
- -- attribute = token
- -- value = token | quoted-string
- --
- -- The type, subtype, and parameter attribute names are not
- -- case-sensitive. Parameter values MAY be case sensitive. Media
- -- types and their use in HTTP are described in section 3.7 of
- -- the HTTP/1.1 specification [8].
- --
- -- Example:
- --
- -- application/x-www-form-urlencoded
- --
- -- There is no default value for this variable. If and only if it
- -- is unset, then the script MAY attempt to determine the media
- -- type from the data received. If the type remains unknown, then
- -- the script MAY choose to either assume a content-type of
- -- application/octet-stream or reject the request with a 415
- -- ("Unsupported Media Type") error. See section 7.2.1.3 for more
- -- information about returning error status values.
- --
- -- Servers MUST provide this metavariable to scripts if a
- -- "Content-Type" field was present in the original request
- -- header. If the server receives a request with an attached
- -- entity but no "Content-Type" header field, it MAY attempt to
- -- determine the correct datatype, or it MAY omit this
- -- metavariable when communicating the request information to the
- -- script.
- deferred
- end
-
- gateway_interface: READABLE_STRING_32
- -- This metavariable is set to the dialect of CGI being used by
- -- the server to communicate with the script. Syntax:
- --
- -- GATEWAY_INTERFACE = "CGI" "/" major "." minor
- -- major = 1*digit
- -- minor = 1*digit
- --
- -- Note that the major and minor numbers are treated as separate
- -- integers and hence each may be more than a single digit. Thus
- -- CGI/2.4 is a lower version than CGI/2.13 which in turn is
- -- lower than CGI/12.3. Leading zeros in either the major or the
- -- minor number MUST be ignored by scripts and SHOULD NOT be
- -- generated by servers.
- --
- -- This document defines the 1.1 version of the CGI interface
- -- ("CGI/1.1").
- --
- -- Servers MUST provide this metavariable to scripts.
- --
- -- The version of the CGI specification to which this server
- -- complies. Syntax:
- --
- -- GATEWAY_INTERFACE = "CGI" "/" 1*digit "." 1*digit
- --
- -- Note that the major and minor numbers are treated as separate
- -- integers and that each may be incremented higher than a single
- -- digit. Thus CGI/2.4 is a lower version than CGI/2.13 which in
- -- turn is lower than CGI/12.3. Leading zeros must be ignored by
- -- scripts and should never be generated by servers.
- deferred
- end
-
- path_info: READABLE_STRING_32
- -- The PATH_INFO metavariable specifies a path to be interpreted
- -- by the CGI script. It identifies the resource or sub-resource
- -- to be returned by the CGI script, and it is derived from the
- -- portion of the URI path following the script name but
- -- preceding any query data. The syntax and semantics are similar
- -- to a decoded HTTP URL 'path' token (defined in RFC 2396 [4]),
- -- with the exception that a PATH_INFO of "/" represents a single
- -- void path segment.
- --
- -- PATH_INFO = "" | ( "/" path )
- -- path = segment *( "/" segment )
- -- segment = *pchar
- -- pchar = Your Name Here
+you@yourdomain.com
+To take a position as a software engineer.
+Junior Developer, Software Company (2010 - Present)
+Languages: C#, JavaScript, Python, Ruby, Eiffel
+Frameworks: .NET, Node.js, Django, Ruby on Rails, EWF
+BS, Economics, My University
+Use a tool to see the request and header details, for example (Developers tools in Chrome or Firebugs in Firefox)
+Click on the following link will redirect you to the HTTP Specifcation, we can do the redirect from the HTML directly but + here we want to show you an exmaple, where you can do something before to send a redirect Redirect
+ +Click on the following link, the server will answer with a 400 error, check the status code Bad Request
+ +Click on the following link, the server will answer with a 500 error, check the status code Internal Error
+ +Click on the following link or add to the end of the url something like /1030303 the server will answer with a 404 error, check the status code Not found
+ +Use a tool to see the request and header details, for example (Developers tools in Chrome or Firebugs in Firefox)
+Use a tool to see the request and header details, for example (Developers tools in Chrome or Firebugs in Firefox)
+Use a tool to see the request and header details, for example (Developers tools in Chrome or Firebugs in Firefox)
+Use a tool to see the request and header details, for example (Developers tools in Chrome or Firebugs in Firefox)
+Use a tool to see the request and header details, for example (Developers tools in Chrome or Firebugs in Firefox)
+Response headers
+ +Use a tool to see the request and header details, for example (Developers tools in Chrome or Firebugs in Firefox)
+Use a tool to see the request and header details, for example (Developers tools in Chrome or Firebugs in Firefox)
+Click on the following link will redirect you to the HTTP Specifcation, we can do the redirect from the HTML directly but + here we want to show you an exmaple, where you can do something before to send a redirect Redirect
+ +Click on the following link, the server will answer with a 400 error, check the status code Bad Request
+ +Click on the following link, the server will answer with a 500 error, check the status code Internal Error
+ +Click on the following link or add to the end of the url something like /1030303 the server will answer with a 404 error, check the status code Not found
+ +Use a tool to see the request and header details, for example (Developers tools in Chrome or Firebugs in Firefox)
+