Compare commits
55 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 331d6e9a69 | |||
| d8be5a0233 | |||
|
|
595cf01a4b | ||
|
|
ed0b0fa5b4 | ||
|
|
540b0ffdfe | ||
|
|
8899d3404e | ||
|
|
68ed91f2c0 | ||
|
|
1df1c191d5 | ||
|
|
fc4d43b47c | ||
|
|
d956249183 | ||
|
|
400b12e986 | ||
|
|
cea57bb09d | ||
|
|
62ca6f8b59 | ||
|
|
bae84f1e29 | ||
|
|
3938d4422d | ||
|
|
44f5918e86 | ||
|
|
0fd1f4d993 | ||
|
|
2b29b4138d | ||
| e2150754cb | |||
|
|
6cc16333d2 | ||
|
|
e297486899 | ||
|
|
966923e4d6 | ||
|
|
da59323321 | ||
|
|
0e17c06862 | ||
| cc1e1d24be | |||
| d15ac6834f | |||
| f6fea6f0c7 | |||
| 912eb3df96 | |||
| 5fb4ef916f | |||
| 7ee05fc1d3 | |||
| bf50d3fa09 | |||
|
|
23c5266304 | ||
|
|
6180c160c9 | ||
|
|
fb829ffc22 | ||
|
|
1ff7f0caa0 | ||
|
|
bead16693a | ||
|
|
5912587f68 | ||
|
|
2992508c15 | ||
|
|
7f0011e96c | ||
|
|
6cbe2e88a2 | ||
|
|
a672f52bc2 | ||
|
|
a9cce7f083 | ||
|
|
e1084bd51c | ||
|
|
ae6d8e163e | ||
|
|
a64f5bbe6f | ||
|
|
4761743995 | ||
|
|
46aa9a21e8 | ||
|
|
559673588d | ||
|
|
f78b8ec4a4 | ||
|
|
2e35f5519c | ||
|
|
a22982abfb | ||
|
|
0a9e59ba38 | ||
|
|
555214fb47 | ||
|
|
76f1310bd8 | ||
|
|
44a020b907 |
8
.gitignore
vendored
@@ -1,7 +1,3 @@
|
||||
EIFGENs
|
||||
tests/temp/
|
||||
.svn/
|
||||
*.swp
|
||||
*~
|
||||
*.scm
|
||||
*#
|
||||
_gh_pages
|
||||
Gemfile.lock
|
||||
|
||||
0
.gitmodules
vendored
18
.travis.yml
@@ -1,18 +0,0 @@
|
||||
language: eiffel
|
||||
before_script:
|
||||
- export current_dir=$PWD ; echo current_dir=$current_dir ; cd ..
|
||||
- curl -sSL https://www.eiffel.org/setup/install.sh | bash > eiffel.rc
|
||||
- source ./eiffel.rc
|
||||
- echo `ec -version`
|
||||
- cd $current_dir
|
||||
- echo Check projects compilation status...
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- v1
|
||||
- develop
|
||||
|
||||
script: compile_all -ecb -melt -list_failures -log_verbose -clean -options dotnet=false
|
||||
group: stable
|
||||
os: linux
|
||||
6148
CHANGELOG.md
142
CONTRIBUTING.md
@@ -1,142 +0,0 @@
|
||||
# Contributing to this project
|
||||
|
||||
Please take a moment to review this document in order to make the contribution
|
||||
process easy and effective for everyone involved.
|
||||
|
||||
Following these guidelines helps to communicate that you respect the time of
|
||||
the developers managing and developing this open source project. In return,
|
||||
they should reciprocate that respect in addressing your issue or assessing
|
||||
patches and features.
|
||||
|
||||
|
||||
## Using the issue tracker
|
||||
|
||||
The issue tracker is the preferred channel for [bug reports](#bugs),
|
||||
[features requests](#features) and [submitting pull
|
||||
requests](#pull-requests), but please respect the following restrictions:
|
||||
|
||||
* Please **do not** use the issue tracker for personal support requests (use
|
||||
[Stack Overflow](http://stackoverflow.com) or IRC).
|
||||
|
||||
* Please **do not** derail or troll issues. Keep the discussion on topic and
|
||||
respect the opinions of others.
|
||||
|
||||
|
||||
<a name="bugs"></a>
|
||||
## Bug reports
|
||||
|
||||
A bug is a _demonstrable problem_ that is caused by the code in the repository.
|
||||
Good bug reports are extremely helpful - thank you!
|
||||
|
||||
Guidelines for bug reports:
|
||||
|
||||
1. **Use the GitHub issue search** — check if the issue has already been
|
||||
reported.
|
||||
|
||||
2. **Check if the issue has been fixed** — try to reproduce it using the
|
||||
latest `master` or development branch in the repository.
|
||||
|
||||
3. **Isolate the problem** — ideally create a [reduced test
|
||||
case](http://css-tricks.com/6263-reduced-test-cases/) and a live example.
|
||||
|
||||
A good bug report shouldn't leave others needing to chase you up for more
|
||||
information. Please try to be as detailed as possible in your report. What is
|
||||
your environment? What steps will reproduce the issue? What browser(s) and OS
|
||||
experience the problem? What would you expect to be the outcome? All these
|
||||
details will help people to fix any potential bugs.
|
||||
|
||||
Example:
|
||||
|
||||
> Short and descriptive example bug report title
|
||||
>
|
||||
> A summary of the issue and the browser/OS environment in which it occurs. If
|
||||
> suitable, include the steps required to reproduce the bug.
|
||||
>
|
||||
> 1. This is the first step
|
||||
> 2. This is the second step
|
||||
> 3. Further steps, etc.
|
||||
>
|
||||
> `<url>` - a link to the reduced test case
|
||||
>
|
||||
> Any other information you want to share that is relevant to the issue being
|
||||
> reported. This might include the lines of code that you have identified as
|
||||
> causing the bug, and potential solutions (and your opinions on their
|
||||
> merits).
|
||||
|
||||
|
||||
<a name="features"></a>
|
||||
## Feature requests
|
||||
|
||||
Feature requests are welcome. But take a moment to find out whether your idea
|
||||
fits with the scope and aims of the project. It's up to *you* to make a strong
|
||||
case to convince the project's developers of the merits of this feature. Please
|
||||
provide as much detail and context as possible.
|
||||
|
||||
|
||||
<a name="pull-requests"></a>
|
||||
## Pull requests
|
||||
|
||||
Good pull requests - patches, improvements, new features - are a fantastic
|
||||
help. They should remain focused in scope and avoid containing unrelated
|
||||
commits.
|
||||
|
||||
**Please ask first** before embarking on any significant pull request (e.g.
|
||||
implementing features, refactoring code, porting to a different language),
|
||||
otherwise you risk spending a lot of time working on something that the
|
||||
project's developers might not want to merge into the project.
|
||||
|
||||
Please adhere to the coding conventions used throughout a project (indentation,
|
||||
accurate comments, etc.) and any other requirements (such as test coverage).
|
||||
|
||||
Adhering to the following this process is the best way to get your work
|
||||
included in the project:
|
||||
|
||||
1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork,
|
||||
and configure the remotes:
|
||||
|
||||
```bash
|
||||
# Clone your fork of the repo into the current directory
|
||||
git clone https://github.com/<your-username>/<repo-name>
|
||||
# Navigate to the newly cloned directory
|
||||
cd <repo-name>
|
||||
# Assign the original repo to a remote called "upstream"
|
||||
git remote add upstream https://github.com/<upstream-owner>/<repo-name>
|
||||
```
|
||||
|
||||
2. If you cloned a while ago, get the latest changes from upstream:
|
||||
|
||||
```bash
|
||||
git checkout <dev-branch>
|
||||
git pull upstream <dev-branch>
|
||||
```
|
||||
|
||||
3. Create a new topic branch (off the main project development branch) to
|
||||
contain your feature, change, or fix:
|
||||
|
||||
```bash
|
||||
git checkout -b <topic-branch-name>
|
||||
```
|
||||
|
||||
4. Commit your changes in logical chunks. Please adhere to these [git commit
|
||||
message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
|
||||
or your code is unlikely be merged into the main project. Use Git's
|
||||
[interactive rebase](https://help.github.com/articles/interactive-rebase)
|
||||
feature to tidy up your commits before making them public.
|
||||
|
||||
5. Locally merge (or rebase) the upstream development branch into your topic branch:
|
||||
|
||||
```bash
|
||||
git pull [--rebase] upstream <dev-branch>
|
||||
```
|
||||
|
||||
6. Push your topic branch up to your fork:
|
||||
|
||||
```bash
|
||||
git push origin <topic-branch-name>
|
||||
```
|
||||
|
||||
7. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/)
|
||||
with a clear title and description.
|
||||
|
||||
**IMPORTANT**: By submitting a patch, you agree to allow the project owner to
|
||||
license your work under the same license as that used by the project.
|
||||
2
Gemfile
Normal file
@@ -0,0 +1,2 @@
|
||||
source 'https://rubygems.org'
|
||||
gem 'github-pages', group: :jekyll_plugins
|
||||
20
LICENSE
@@ -1,20 +0,0 @@
|
||||
Eiffel Forum License, version 2
|
||||
|
||||
1. Permission is hereby granted to use, copy, modify and/or distribute
|
||||
this package, provided that:
|
||||
* copyright notices are retained unchanged,
|
||||
* any distribution of this package, whether modified or not,
|
||||
includes this license text.
|
||||
|
||||
2. Permission is hereby also granted to distribute binary programs which
|
||||
depend on this package. If the binary program depends on a modified
|
||||
version of this package, you are encouraged to publicly release the
|
||||
modified version of this package.
|
||||
|
||||
THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT WARRANTY. ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE TO ANY PARTY FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THIS PACKAGE.
|
||||
|
||||
121
MIGRATION.md
@@ -1,121 +0,0 @@
|
||||
Date: 2015-june
|
||||
|
||||
# Goal:
|
||||
=======
|
||||
- support safe concurrency with EWF
|
||||
- provide a concurrent standalone connector
|
||||
|
||||
# Status:
|
||||
=========
|
||||
- The version v0 of EWF has mainly 3 connectors: CGI, libFCGI, and nino.
|
||||
- CGI and libFCGI connectors does not need any concurrency support.
|
||||
- But the nino connector had a pseudo concurrency support with Thread, however one could do write code that result in hasardeous concurrency execution.
|
||||
|
||||
So, it was decided to provide an improved Eiffel web nino connector, and update EWF design to make it concurrency compliant.
|
||||
|
||||
# Decisions:
|
||||
============
|
||||
- instead of updating current nino library, we now have a new "standalone" connector which is inspired by nino, but have support for the 3 concurrency modes: none, thread and SCOOP.
|
||||
|
||||
|
||||
# Overview
|
||||
==========
|
||||
Adding support for SCOOP concurrency mode add constraints to the design, but also helps ensuring the concurrency design of EWF is correct.
|
||||
|
||||
As a consequence, we had to introduce a new interface WSF_EXECUTION which is instantiated for each incoming request. See its simplified interface :
|
||||
<code lang="eiffel">
|
||||
deferred class WSF_EXECUTION
|
||||
|
||||
feature -- Initialization
|
||||
|
||||
make (req: WGI_REQUEST; res: WGI_RESPONSE)
|
||||
do
|
||||
...
|
||||
īnitialize
|
||||
end
|
||||
|
||||
initialize
|
||||
-- Initialize Current object.
|
||||
--| To be redefined if needed.
|
||||
do
|
||||
end
|
||||
|
||||
|
||||
feature -- Access
|
||||
|
||||
request: WSF_REQUEST
|
||||
-- Access to request data.
|
||||
-- Header, Query, Post, Input data..
|
||||
|
||||
response: WSF_RESPONSE
|
||||
-- Access to output stream, back to the client.
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute
|
||||
-- Execute Current `request',
|
||||
-- getting data from `request'
|
||||
-- and response to client via `response'.
|
||||
deferred
|
||||
ensure
|
||||
is_valid_end_of_execution: is_valid_end_of_execution
|
||||
end
|
||||
|
||||
end
|
||||
</code>
|
||||
|
||||
And the related request execution routines are extracted from WSF_SERVICE which becomes almost useless. The "service" part is not mostly responsible of launching the expected connector and set optional options, and declare the type of "execution" interface.
|
||||
|
||||
As a result, the well known WSF_DEFAULT_SERVICE has now a formal generic that should conform to WSF_EXECUTION with a `make' creation procedure. See update code:
|
||||
|
||||
<code lang="eiffel">
|
||||
class
|
||||
APPLICATION
|
||||
|
||||
inherit
|
||||
WSF_DEFAULT_SERVICE [APPLICATION_EXECUTION]
|
||||
redefine
|
||||
initialize
|
||||
end
|
||||
|
||||
create
|
||||
make_and_launch
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
initialize
|
||||
-- Initialize current service.
|
||||
do
|
||||
set_service_option ("port", 9090)
|
||||
end
|
||||
|
||||
end
|
||||
</code>
|
||||
|
||||
Where APPLICATION_EXECUTION is an implementation of the WSF_EXECUTION interface (with the `make' creation procedure).
|
||||
|
||||
In addition to add better and safer concurrency support, there are other advantages:
|
||||
- we now have a clear separation between the service launcher, and the request execution itself.
|
||||
- the WSF_EXECUTION is created per request, with two main attributes <code>request: WSF_REQUEST</code> and <code>response: WSF_RESPONSE</code>.
|
||||
|
||||
# How to migrate to new design
|
||||
- you can check the various example from the EWF repository, there should all be migrated to new design and comparing previous and new code, this will show you how the migration was done.
|
||||
- a frequent process:
|
||||
- identify the root class of your service, (the class implementing the WSF_SERVICE), let us name it APPLICATION_SERVICE
|
||||
- copy the APPLICATION_SERVICE file to APPLICATION_EXECUTION file.
|
||||
- change the class name to be APPLICATION_EXECUTION, and replace _SERVICE occurences by _EXECUTION (note the new WSF_ROUTED_EXECUTION and so on, which are mainly migration from previous WSF_ROUTED_SERVICE .., and also WSF_FILTERED_ROUTED_EXECUTION which is new.
|
||||
- replace "make_and_launch" by "make", remove the initialize redefinition if any.
|
||||
- in the APPLICATION_SERVICE class, remove most of the ROUTED, FILTERED ... inheritance, and keep WSF_DEFAULT_SERVICE, with a new formal generic i.e WSF_DEFAULT_SERVICE [APPLICATION_EXECUTION].
|
||||
- in the eventual redefined initialize, remove code related to routers, filters, ...
|
||||
- remove all the execution related code.
|
||||
- And you should be done.
|
||||
- To be short, this is mostly creating a new _EXECUTION class, and move the execution related code into this class from the _SERVICE class.
|
||||
- Then, you can replace the usage of nino connector by using the new "Standalone" connector, and switch to SCOOP concurrency mode, to ensure you are not messing up with concurrency. Your own code/libraris may not be SCOOP compliant, we recommend to migrate to SCOOP, but as an intermediate solutioņ, you can use the other concurrency mode (none or thread).
|
||||
|
||||
Note: the new design impacts the _SERVICE classes, connectors, but WSF_REQUEST, WSF_RESPONSE , WSF_ROUTER are compatible, so the migration is really easy.
|
||||
|
||||
We may take the opportunity to update the design deeper according to user feedback, and eventually "wsf" library will be renamed "wsf2".
|
||||
This is work in progress, all comments , feedback, suggestions, bug report are welcome.
|
||||
Hopefully before the final version of the new design is out.
|
||||
|
||||
|
||||
114
README.md
@@ -1,107 +1,25 @@
|
||||
# Eiffel Web Framework
|
||||
# EiffelWeb
|
||||
|
||||
[](https://travis-ci.org/EiffelWebFramework/EWF/)
|
||||
EiffelWeb is a framework to build web applications in Eiffel.
|
||||
|
||||
To get started, check out [http://eiffelwebframework.github.io/EWF](http://eiffelwebframework.github.io/EWF)!
|
||||
|
||||
## Overview
|
||||
## Documentation
|
||||
|
||||
The Eiffel Web Framework (EWF) provides Eiffel users with a layer to build anything on top of the http protocol such as websites, web API/services.
|
||||
EiffelWeb 's documentation, included in this repo in the root directory, is built with [Jekyll](http://jekyllrb.com) and publicly hosted on GitHub Pages at [http://eiffelwebframework.github.io/EWF](http://eiffelwebframework.github.io/EWF). The docs may also be run locally.
|
||||
|
||||
This layer is multi-platform: it can be set on Windows, Linux operating systems, and in addition it can run on top of any httpd servers such as Apache2, IIS, nginx, lighttpd. EWF includes as well a standalone httpd web server component, written in Eiffel, which enables users to run easily a web server on their machine, or even embed this component in any application written with Eiffel.
|
||||
### Running documentation locally
|
||||
|
||||
Currently EWF offers a collection of Eiffel libraries designed to be integrated with each others, and among other functionalities, it give simple access to the request data, to handle content negotiation, url dispatcher, integrate with openid system, and so on.
|
||||
1. If necessary, [install Jekyll](http://jekyllrb.com/docs/installation) (requires v1.x).
|
||||
2. From the root `/EWF` directory, run `jekyll serve` in the command line.
|
||||
- **Windows users:** run `chcp 65001` first to change the command prompt's character encoding ([code page](http://en.wikipedia.org/wiki/Windows_code_page)) to UTF-8 so Jekyll runs without errors.
|
||||
3. Open [http://localhost:9000](http://localhost:9000) in your browser, and voilà.
|
||||
|
||||
There is a growing ecosystem around EWF, that provides useful components:
|
||||
* OpenID and OAuth consumer library
|
||||
* Various hypermedia format such as HAL, Collection+json, ...
|
||||
* Websocket server and client
|
||||
* Template engine
|
||||
* API Auto-documentation with swagger
|
||||
* A simple experimental CMS.
|
||||
* ...
|
||||
Learn more about using Jekyll by reading their [documentation](http://jekyllrb.com/docs/home/).
|
||||
|
||||
So if you want to build a website, a web api, RESTful service, ... or even if you want to consume other web api, EWF is a solution.
|
||||
### Update the wiki pages
|
||||
1. git remote add -f ewf_wiki https://github.com/EiffelWebFramework/EWF.wiki.git
|
||||
2. git merge -s ours --no-commit --squash ewf_wiki/master
|
||||
3. git pull -X subtree=wiki ewf_wiki master
|
||||
4. then git commit if needed
|
||||
|
||||
EWF brings with it all the advantages of the Eiffel technology and tools with its powerful features such as Design by Contract, debugging, testing tools which enable to build efficient systems expected to be repeatedly refined, extended, and improved in a predictable and controllable way so as to become with time bugfree systems. Enjoy the full power of debugging your web server application from the IDE.
|
||||
|
||||
## Project
|
||||
|
||||
Official project site for Eiffel Web Framework:
|
||||
|
||||
* http://eiffelwebframework.github.com/EWF/
|
||||
|
||||
For more information please have a look at the related wiki:
|
||||
|
||||
* https://github.com/EiffelWebFramework/EWF/wiki
|
||||
|
||||
For download, check
|
||||
* https://github.com/EiffelWebFramework/EWF/downloads
|
||||
|
||||
Tasks and issues are managed with github issue system
|
||||
* See https://github.com/EiffelWebFramework/EWF/issues
|
||||
* And visual dashboard: https://waffle.io/eiffelwebframework/ewf
|
||||
* Forum/group post: https://groups.google.com/forum/#!forum/eiffel-web-framework
|
||||
|
||||
## Requirements
|
||||
* Compiling from EiffelStudio 16.05 to 17.05 and more recent version of the compiler.
|
||||
* Currently being developped using EiffelStudio 17.01 (on Windows, Linux)
|
||||
* Tested using EiffelStudio 17.01 with "jenkins" CI server.
|
||||
* The code have to allow __void-safe__ compilation and non void-safe system (see [more about void-safety](https://www.eiffel.org/doc/eiffel/Void-safe%20programming%20in%20Eiffel)
|
||||
|
||||
## How to get the source code?
|
||||
|
||||
Using git
|
||||
* `git clone https://github.com/EiffelWebFramework/EWF.git`
|
||||
|
||||
* And to build the required and related Clibs
|
||||
* `cd contrib/ise_library/cURL`
|
||||
* `geant compile`
|
||||
|
||||
## Libraries under 'library'
|
||||
|
||||
### server
|
||||
* __ewsgi__: Eiffel Web Server Gateway Interface [read more](library/server/ewsgi)
|
||||
* connectors: various web server connectors for EWSGI
|
||||
* libfcgi: Wrapper for libfcgi SDK
|
||||
* __wsf__: Web Server Framework [read more](library/server/wsf)
|
||||
* __router__: URL dispatching/routing based on `uri`, `uri_template`, or custom [read more](library/server/wsf/router)
|
||||
|
||||
### protocol
|
||||
* __http__: HTTP related classes, constants for status code, content types, ... [read more](library/network/protocol/http)
|
||||
* __uri_template__: URI Template library (parsing and expander) [read more](library/network/protocol/uri_template)
|
||||
* __CONNEG__: Content negotiation library (Content-type Negociation) [read more](library/network/protocol/content_negotiation)
|
||||
|
||||
### client
|
||||
* __http_client__: simple HTTP client based on cURL [read more](library/network/http_client)
|
||||
|
||||
### text
|
||||
* __encoder__: Various simpler encoders: base64, url-encoder, xml entities, html entities [read more](library/text/encoder)
|
||||
|
||||
### Others
|
||||
* error: very simple/basic library to handle error
|
||||
|
||||
## Draft folder = call for contribution ##
|
||||
|
||||
## Examples
|
||||
..
|
||||
|
||||
## Contributing to this project
|
||||
|
||||
Anyone and everyone is welcome to contribute. Please take a moment to
|
||||
review the [guidelines for contributing](CONTRIBUTING.md).
|
||||
|
||||
* [Bug reports](CONTRIBUTING.md#bugs)
|
||||
* [Feature requests](CONTRIBUTING.md#features)
|
||||
* [Pull requests](CONTRIBUTING.md#pull-requests)
|
||||
|
||||
## Community
|
||||
|
||||
Keep track of development and community news.
|
||||
|
||||
* Follow [@EiffelWeb](https://twitter.com/EiffelWeb) on Twitter
|
||||
* [Forum](https://groups.google.com/forum/#!forum/eiffel-web-framework) on Google groups.
|
||||
* Follow our [page](https://plus.google.com/u/0/110650349519032194479) and [community](https://plus.google.com/communities/110457383244374256721) on Google+
|
||||
* Have a question that's not a feature request or bug report? [Ask on the mailing list](http://groups.google.com/group/eiffel-web-framework)
|
||||
|
||||
|
||||
For more information please have a look at the related [workbook documentation](docs/workbook)
|
||||
|
||||
@@ -7,7 +7,7 @@ permalink: pretty
|
||||
|
||||
# Server
|
||||
destination: ./_gh_pages
|
||||
exclude: [".gitignore", "Gruntfile.js", "package.json", "node_modules", "/readme_github_page.md", "*.py", ".scripts"]
|
||||
exclude: [".gitignore", "Gruntfile.js", "package.json", "node_modules", "/README.md", "*.py"]
|
||||
port: 9000
|
||||
|
||||
# Custom vars
|
||||
@@ -15,8 +15,4 @@ repo: https://github.com/EiffelWebFramework/EWF
|
||||
version: v1
|
||||
download: https://github.com/EiffelWebFramework/EWF/archive/v1.zip
|
||||
|
||||
plugins:
|
||||
- jekyll-relative-links
|
||||
relative_links:
|
||||
enabled: true
|
||||
|
||||
theme: jekyll-theme-architect
|
||||
@@ -10,25 +10,25 @@
|
||||
{% endif %}
|
||||
</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link href="{{ site.url }}/css/vendor/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="{{ site.url }}/css/main.css" rel="stylesheet">
|
||||
<link href="{{ site.url }}/css/vendor/lang-eiffel.css" rel="stylesheet">
|
||||
<link href="{{ page.base_url }}css/vendor/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="{{ page.base_url }}css/main.css" rel="stylesheet">
|
||||
<link href="{{ page.base_url }}css/vendor/lang-eiffel.css" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<div class="container-narrow">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li{% if page.title == "EiffelWeb" %} class="active"{% endif %}>
|
||||
<a href="{{ site.url }}">Home</a>
|
||||
<a href="{{ page.base_url }}index.html">Home</a>
|
||||
</li>
|
||||
<li{% if page.title == "Getting Started" %} class="active"{% endif %}>
|
||||
<a href="{{ site.url }}/getting-started">Getting Started</a>
|
||||
<a href="{{ page.base_url }}getting-started">Getting Started</a>
|
||||
</li>
|
||||
<li{% if page.title == "Community" %} class="active"{% endif %}>
|
||||
<a href="{{ site.url }}/community">Community</a>
|
||||
<a href="{{ page.base_url }}community">Community</a>
|
||||
</li>
|
||||
<li{% if page.title == "Documentation" %} class="active"{% endif %}>
|
||||
<a href="{{ site.url }}/workbook/workbook">Documentation</a>
|
||||
<a href="{{ page.base_url }}workbook/workbook">Documentation</a>
|
||||
</li>
|
||||
</ul>
|
||||
<h3 class="muted">EiffelWeb</h3>
|
||||
@@ -37,13 +37,13 @@
|
||||
{{ content }}
|
||||
<hr>
|
||||
<div class="footer">
|
||||
<p>© EiffelWeb framework 2012-2017</p>
|
||||
<p>© EiffelWeb framework 2012-2020</p>
|
||||
</div>
|
||||
</div> <!-- /container -->
|
||||
<script src="{{ site.url }}/js/vendor/jquery.min.js"></script>
|
||||
<script src="{{ site.url }}/js/vendor/bootstrap.min.js"></script>
|
||||
<script src="{{ page.base_url }}js/vendor/jquery.min.js"></script>
|
||||
<script src="{{ page.base_url }}js/vendor/bootstrap.min.js"></script>
|
||||
<script src="http://platform.twitter.com/widgets.js"></script>
|
||||
<script src="{{ site.url }}/js/vendor/run_prettify.js"></script>
|
||||
<script src="{{ site.url }}/js/vendor/lang-eiffel.js"></script>
|
||||
<script src="{{ page.base_url }}js/vendor/run_prettify.js"></script>
|
||||
<script src="{{ page.base_url }}js/vendor/lang-eiffel.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
35
build.eant
@@ -1,35 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<project name="build_library" default="help">
|
||||
<description>
|
||||
description: "Compile Eiffel Web Framework"
|
||||
</description>
|
||||
|
||||
<target name="help">
|
||||
<echo message="usage:"/>
|
||||
<echo message=" geant compile"/>
|
||||
<echo message=" geant clean"/>
|
||||
<echo message=" geant clobber"/>
|
||||
</target>
|
||||
|
||||
<target name="compile" >
|
||||
<echo message="- Compile EWF" />
|
||||
<geant target="_build_tpl_" arguments="compile" />
|
||||
</target>
|
||||
|
||||
<target name="clean" >
|
||||
<echo message="- Clean EWF" />
|
||||
<geant target="_build_tpl_" arguments="clean" />
|
||||
</target>
|
||||
|
||||
<target name="clobber" >
|
||||
<echo message="- Clobber EWF" />
|
||||
<geant target="_build_tpl_" arguments="clobber" />
|
||||
</target>
|
||||
|
||||
<target name="_build_tpl_" >
|
||||
<argument name="_target_name" />
|
||||
<geant target="${_target_name}" dir="contrib" file="build.eant" reuse_variables="true" />
|
||||
</target>
|
||||
|
||||
</project>
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
layout: default
|
||||
title: Community
|
||||
base_url: "../"
|
||||
---
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
@@ -1,37 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<project name="build_library" default="help">
|
||||
<description>
|
||||
description: "Compile Eiffel Web Framework / Contrib"
|
||||
</description>
|
||||
|
||||
<target name="help">
|
||||
<echo message="usage:"/>
|
||||
<echo message=" geant compile"/>
|
||||
<echo message=" geant clean"/>
|
||||
<echo message=" geant clobber"/>
|
||||
</target>
|
||||
|
||||
<target name="compile" >
|
||||
<echo message="- Compile contrib" />
|
||||
<geant target="_build_tpl_" arguments="compile" />
|
||||
</target>
|
||||
|
||||
<target name="clean" >
|
||||
<echo message="- Clean contrib" />
|
||||
<geant target="_build_tpl_" arguments="clean" />
|
||||
</target>
|
||||
|
||||
<target name="clobber" >
|
||||
<echo message="- Clobber contrib" />
|
||||
<geant target="_build_tpl_" arguments="clobber" />
|
||||
</target>
|
||||
|
||||
<target name="_build_tpl_" >
|
||||
<argument name="_target_name" />
|
||||
<!--
|
||||
<geant target="${_target_name}" dir="library" file="build.eant" reuse_variables="true" />
|
||||
-->
|
||||
</target>
|
||||
|
||||
</project>
|
||||
@@ -1 +0,0 @@
|
||||
EIFGENs
|
||||
@@ -1,44 +0,0 @@
|
||||
note
|
||||
description : "nino application root class"
|
||||
date : "$Date$"
|
||||
revision : "$Revision$"
|
||||
|
||||
class
|
||||
APPLICATION
|
||||
|
||||
inherit
|
||||
ARGUMENTS
|
||||
|
||||
HTTP_SERVER_SHARED_CONFIGURATION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
-- Run application.
|
||||
local
|
||||
l_server : HTTP_SERVER
|
||||
l_cfg: HTTP_SERVER_CONFIGURATION
|
||||
l_http_handler : HTTP_HANDLER
|
||||
do
|
||||
create l_cfg.make
|
||||
l_cfg.http_server_port := 9_000
|
||||
l_cfg.document_root := default_document_root
|
||||
set_server_configuration (l_cfg)
|
||||
debug ("nino")
|
||||
l_cfg.set_is_verbose (True)
|
||||
end
|
||||
|
||||
create l_server.make (l_cfg)
|
||||
create {APPLICATION_CONNECTION_HANDLER} l_http_handler.make (l_server)
|
||||
l_server.setup (l_http_handler)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
default_document_root: STRING = "webroot"
|
||||
|
||||
end
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {HTTP_CONNECTION_HANDLER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
APPLICATION_CONNECTION_HANDLER
|
||||
|
||||
inherit
|
||||
HTTP_CONNECTION_HANDLER
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Request processing
|
||||
|
||||
process_request (a_handler: HTTP_CONNECTION_HANDLER; a_socket: TCP_STREAM_SOCKET)
|
||||
-- Process request ...
|
||||
local
|
||||
a_method: STRING
|
||||
do
|
||||
a_method := a_handler.method
|
||||
|
||||
if a_method.is_equal (Get) then
|
||||
execute_get_request (a_handler.uri, a_handler.request_header_map, a_handler.request_header, a_socket)
|
||||
elseif a_method.is_equal (Post) then
|
||||
execute_post_request (a_handler.uri, a_handler.request_header_map, a_handler.request_header, a_socket)
|
||||
elseif a_method.is_equal (Put) then
|
||||
elseif a_method.is_equal (Options) then
|
||||
elseif a_method.is_equal (Head) then
|
||||
elseif a_method.is_equal (Delete) then
|
||||
elseif a_method.is_equal (Trace) then
|
||||
elseif a_method.is_equal (Connect) then
|
||||
else
|
||||
debug
|
||||
print ("Method [" + a_method + "] not supported")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
execute_get_request (a_uri: STRING; a_headers_map: HASH_TABLE [STRING, STRING]; a_headers_text: STRING; a_socket: TCP_STREAM_SOCKET)
|
||||
local
|
||||
l_http_request : HTTP_REQUEST_HANDLER
|
||||
do
|
||||
create {GET_REQUEST_HANDLER} l_http_request.make (a_socket)
|
||||
l_http_request.set_uri (a_uri)
|
||||
l_http_request.process
|
||||
end
|
||||
|
||||
execute_post_request (a_uri: STRING; a_headers_map: HASH_TABLE [STRING, STRING]; a_headers_text: STRING; a_socket: TCP_STREAM_SOCKET)
|
||||
local
|
||||
l_http_request : HTTP_REQUEST_HANDLER
|
||||
do
|
||||
check not_yet_implemented: False end
|
||||
create {POST_REQUEST_HANDLER} l_http_request.make (a_socket)
|
||||
l_http_request.set_uri (a_uri)
|
||||
l_http_request.process
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,48 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {HTTP_SERVER_SHARED_CONFIGURATION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
HTTP_SERVER_SHARED_CONFIGURATION
|
||||
|
||||
feature -- Access
|
||||
|
||||
server_configuration: detachable HTTP_SERVER_CONFIGURATION
|
||||
-- Shared configuration
|
||||
do
|
||||
if attached server_configuration_cell.item as l_cfg then
|
||||
Result := l_cfg
|
||||
end
|
||||
end
|
||||
|
||||
document_root: STRING_8
|
||||
-- Shared document root
|
||||
do
|
||||
if attached server_configuration as l_cfg then
|
||||
Result := l_cfg.document_root
|
||||
else
|
||||
Result := ""
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_server_configuration (a_cfg: like server_configuration)
|
||||
-- Set `server_configuration' to `a_cfg'.
|
||||
do
|
||||
server_configuration_cell.replace (a_cfg)
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
server_configuration_cell: CELL [detachable HTTP_SERVER_CONFIGURATION]
|
||||
once ("PROCESS")
|
||||
create Result.put (Void)
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2011, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
@@ -1,172 +0,0 @@
|
||||
class
|
||||
GET_REQUEST_HANDLER
|
||||
|
||||
inherit
|
||||
HTTP_REQUEST_HANDLER
|
||||
|
||||
HTTP_SERVER_SHARED_CONFIGURATION
|
||||
undefine
|
||||
default_create
|
||||
end
|
||||
|
||||
SHARED_URI_CONTENTS_TYPES
|
||||
undefine
|
||||
default_create
|
||||
end
|
||||
|
||||
HTTP_CONSTANTS
|
||||
undefine
|
||||
default_create
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_socket: TCP_STREAM_SOCKET)
|
||||
do
|
||||
default_create
|
||||
socket := a_socket
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
socket: TCP_STREAM_SOCKET
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- process the request and create an answer
|
||||
local
|
||||
fname: STRING_8
|
||||
f: RAW_FILE
|
||||
ctype, extension: detachable STRING_8
|
||||
do
|
||||
answer.reset
|
||||
if script_name.is_equal ("/") then
|
||||
process_default
|
||||
answer.set_content_type ("text/html")
|
||||
else
|
||||
create fname.make_from_string (Document_root)
|
||||
fname.append (script_name)
|
||||
debug
|
||||
print ("URI filename: " + fname)
|
||||
end
|
||||
create f.make (real_filename (fname))
|
||||
if f.exists then
|
||||
extension := Ct_table.extension (script_name)
|
||||
ctype := Ct_table.content_types.item (extension)
|
||||
if f.is_directory then
|
||||
process_directory (f)
|
||||
else
|
||||
if ctype = Void then
|
||||
process_raw_file (f)
|
||||
answer.set_content_type ("text/html")
|
||||
else
|
||||
if ctype.is_equal ("text/html") then
|
||||
process_text_file (f)
|
||||
else
|
||||
process_raw_file (f)
|
||||
end
|
||||
answer.set_content_type (ctype)
|
||||
end
|
||||
end
|
||||
else
|
||||
answer.set_status_code (Not_found)
|
||||
answer.set_reason_phrase (Not_found_message)
|
||||
answer.set_reply_text ("Not found on this server")
|
||||
end
|
||||
end
|
||||
if attached answer.reply_text as t then
|
||||
answer.set_content_length (t.count)
|
||||
else
|
||||
answer.set_content_length (0)
|
||||
end
|
||||
|
||||
--| Output the result
|
||||
socket.put_string (answer.reply_header + answer.reply_text)
|
||||
end
|
||||
|
||||
process_default
|
||||
-- Return a default response
|
||||
local
|
||||
html: STRING_8
|
||||
do
|
||||
answer.set_reply_text ("")
|
||||
html := " <html> <head> <title> NINO HTTPD </title> " + " </head> " + " <body> " + " <h1> Welcome to NINO HTTPD! </h1> " + " <p> Default page " + " </p> " + " </body> " + " </html> "
|
||||
answer.append_reply_text (html)
|
||||
end
|
||||
|
||||
process_text_file (f: FILE)
|
||||
-- send a text file reply
|
||||
require
|
||||
valid_f: f /= Void
|
||||
do
|
||||
f.open_read
|
||||
from
|
||||
answer.set_reply_text ("")
|
||||
f.read_line
|
||||
until
|
||||
f.end_of_file
|
||||
loop
|
||||
answer.append_reply_text (f.last_string)
|
||||
answer.append_reply_text (Crlf)
|
||||
f.read_line
|
||||
end
|
||||
f.close
|
||||
end
|
||||
|
||||
process_raw_file (f: FILE)
|
||||
-- send a raw file reply
|
||||
require
|
||||
valid_f: f /= Void
|
||||
do
|
||||
f.open_read
|
||||
from
|
||||
answer.set_reply_text ("")
|
||||
until
|
||||
f.end_of_file
|
||||
loop
|
||||
f.read_stream_thread_aware (1024)
|
||||
answer.append_reply_text (f.last_string)
|
||||
end
|
||||
f.close
|
||||
end
|
||||
|
||||
process_directory (f: FILE)
|
||||
--read the directory
|
||||
require
|
||||
is_directory: f.is_directory
|
||||
local
|
||||
l_dir: DIRECTORY
|
||||
files: ARRAYED_LIST [STRING_8]
|
||||
html1: STRING_8
|
||||
html2: STRING_8
|
||||
htmldir: STRING_8
|
||||
path: STRING_8
|
||||
do
|
||||
answer.set_reply_text ("")
|
||||
html1 := " <html> <head> <title> NINO HTTPD </title> " + " </head> " + " <body> " + " <h1> Welcome to NINO HTTPD! </h1> " + " <p> Default page "
|
||||
html2 := " </p> " + " </body> " + " </html> "
|
||||
path := script_name
|
||||
if path[path.count] = '/' then
|
||||
path.remove_tail (1)
|
||||
end
|
||||
create l_dir.make_open_read (f.name)
|
||||
files := l_dir.linear_representation
|
||||
from
|
||||
files.start
|
||||
htmldir := "<ul>"
|
||||
until
|
||||
files.after
|
||||
loop
|
||||
htmldir := htmldir + "<li><a href=%"" + path + "/" + files.item_for_iteration + "%">" + files.item_for_iteration + "</a> </li>%N"
|
||||
files.forth
|
||||
end
|
||||
htmldir := htmldir + "</ul>"
|
||||
answer.append_reply_text (html1 + htmldir + html2)
|
||||
end
|
||||
|
||||
end -- class GET_REQUEST_HANDLER
|
||||
|
||||
@@ -1,115 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {HEAD_REQUEST_HANDLER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
HEAD_REQUEST_HANDLER
|
||||
|
||||
inherit
|
||||
|
||||
SHARED_DOCUMENT_ROOT
|
||||
|
||||
SHARED_URI_CONTENTS_TYPES
|
||||
|
||||
HTTP_REQUEST_HANDLER
|
||||
|
||||
HTTP_CONSTANTS
|
||||
|
||||
feature
|
||||
|
||||
|
||||
process
|
||||
-- process the request and create an answer
|
||||
local
|
||||
fname: STRING
|
||||
f: RAW_FILE
|
||||
ctype, extension: STRING
|
||||
do
|
||||
fname := document_root_cell.item.twin
|
||||
fname.append (request_uri)
|
||||
debug
|
||||
print ("URI name: " + fname )
|
||||
end
|
||||
create f.make (fname)
|
||||
create answer.make
|
||||
if f.exists then
|
||||
extension := ct_table.extension (request_uri)
|
||||
ctype := ct_table.content_types.item (extension)
|
||||
-- TODO: This code could be improved to avoid string
|
||||
-- comparisons
|
||||
if ctype = Void then
|
||||
process_default
|
||||
answer.set_content_type ("text/html")
|
||||
else
|
||||
if ctype.is_equal ("text/html") then
|
||||
process_text_file (f)
|
||||
else
|
||||
process_raw_file (f)
|
||||
end
|
||||
answer.set_content_type (ctype)
|
||||
end
|
||||
else
|
||||
answer.set_status_code (not_found)
|
||||
answer.set_reason_phrase (not_found_message)
|
||||
answer.set_reply_text ("Not found on this server%N%R")
|
||||
end
|
||||
end
|
||||
|
||||
process_default
|
||||
--
|
||||
local
|
||||
html : STRING
|
||||
do
|
||||
answer.set_reply_text ("")
|
||||
html := " <html> <head> <title> Micro HTTPD </title> " +
|
||||
" </head> " +
|
||||
" <body> " +
|
||||
" <h1> Welcome to Micro HTTPD! </h1> "+
|
||||
" <p> Default page " +
|
||||
|
||||
" </p> " +
|
||||
" </body> " +
|
||||
" </html> "
|
||||
answer.append_reply_text (html)
|
||||
end
|
||||
|
||||
|
||||
process_text_file (f: FILE)
|
||||
-- send a text file reply
|
||||
require
|
||||
valid_f: f /= Void
|
||||
do
|
||||
f.open_read
|
||||
from
|
||||
answer.set_reply_text ("")
|
||||
f.read_line
|
||||
until f.end_of_file
|
||||
loop
|
||||
answer.append_reply_text (f.last_string)
|
||||
answer.append_reply_text (crlf)
|
||||
f.read_line
|
||||
end
|
||||
f.close
|
||||
end
|
||||
|
||||
process_raw_file (f: FILE)
|
||||
-- send a raw file reply
|
||||
require
|
||||
valid_f: f /= Void
|
||||
do
|
||||
-- this is not quite right....
|
||||
f.open_read
|
||||
from
|
||||
answer.set_reply_text ("")
|
||||
until f.end_of_file
|
||||
loop
|
||||
f.read_stream (1024)
|
||||
answer.append_reply_text (f.last_string)
|
||||
end
|
||||
f.close
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
@@ -1,53 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {POST_REQUEST_HANDLER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
POST_REQUEST_HANDLER
|
||||
|
||||
inherit
|
||||
GET_REQUEST_HANDLER
|
||||
redefine
|
||||
process
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- process the request and create an answer
|
||||
local
|
||||
l_data: STRING
|
||||
s: detachable STRING
|
||||
n: INTEGER
|
||||
sock: like socket
|
||||
do
|
||||
from
|
||||
n := 1_024
|
||||
sock := socket
|
||||
if sock.socket_ok then
|
||||
sock.read_stream_thread_aware (n)
|
||||
s := sock.last_string
|
||||
else
|
||||
s := Void
|
||||
end
|
||||
create l_data.make_empty
|
||||
until
|
||||
s = Void or else s.count < n
|
||||
loop
|
||||
l_data.append_string (s)
|
||||
if sock.socket_ok then
|
||||
sock.read_stream_thread_aware (n)
|
||||
s := sock.last_string
|
||||
else
|
||||
s := Void
|
||||
end
|
||||
end
|
||||
Precursor
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,3 +0,0 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<redirection xmlns="http://www.eiffel.com/developers/xml/configuration-1-16-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-16-0 http://www.eiffel.com/developers/xml/configuration-1-16-0.xsd" uuid="B1D3254D-A58E-4259-9796-8A2843A511A9" message="Obsolete: use web_server.ecf !" location="web_server.ecf">
|
||||
</redirection>
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-16-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-16-0 http://www.eiffel.com/developers/xml/configuration-1-16-0.xsd" name="nino_web_server" uuid="B1D3254D-A58E-4259-9796-8A2843A511A9">
|
||||
<target name="nino_web_server">
|
||||
<root class="APPLICATION" feature="make"/>
|
||||
<file_rule>
|
||||
<exclude>/\.git$</exclude>
|
||||
<exclude>/\.svn$</exclude>
|
||||
<exclude>/CVS$</exclude>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" >
|
||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||
</option>
|
||||
<capability>
|
||||
<concurrency support="thread" use="thread"/>
|
||||
</capability>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/>
|
||||
<library name="net" location="$ISE_LIBRARY\library\net\net.ecf"/>
|
||||
<library name="nino" location="..\..\nino.ecf"/>
|
||||
<library name="thread" location="$ISE_LIBRARY\library\thread\thread.ecf"/>
|
||||
<cluster name="src" location=".\" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
|
Before Width: | Height: | Size: 578 B |
@@ -1,91 +0,0 @@
|
||||
1.4.2
|
||||
[Feature]
|
||||
- The plugin support percentages as target ('50%' or {top:'50%', left:'45%'})
|
||||
- Exposed the max() calculation as $.scrollTo.max
|
||||
[Enhancement]
|
||||
- Renamed $.fn.scrollable to $.fn._scrollable to avoid conflicts with other plugins
|
||||
[Fix]
|
||||
- Fixing max calculations for regular DOM elements
|
||||
|
||||
1.4.1
|
||||
[Feature]
|
||||
- The target can be 'max' to scroll to the end while keeping it elegant.
|
||||
[Enhancement]
|
||||
- Default duration is 0 for jquery +1.3. Means sync animation
|
||||
- The plugin works on all major browsers, on compat & quirks modes, including iframes.
|
||||
- In addition to window/document, if html or body are received, the plugin will choose the right one.
|
||||
[Fix]
|
||||
- The plugin accepts floating numbers, Thanks Ramin
|
||||
- Using jQuery.nodeName where neccessary so that this works on xml+xhtml
|
||||
- The max() internal function wasn't completely accurrate, now it is 98% (except for IE on quirks mode and it's not too noticeable).
|
||||
|
||||
1.4
|
||||
[Fix]
|
||||
- Fixed the problem when scrolling the window to absolute positioned elements on Safari.
|
||||
- Fixed the problem on Opera 9.5 when scrolling the window. That it always scrolls to 0.
|
||||
[Feature]
|
||||
- Added the settings object as 2nd argument to the onAfter callback.
|
||||
- The 3rd argument of scrollTo can be just a function and it's used as the onAfter.
|
||||
- Added full support for iframes (even max scroll calculation).
|
||||
- Instead of $.scrollTo, $(window).scrollTo() and $(document).scrollTo() can be used.
|
||||
- Added $().scrollable() that returns the real element to scroll, f.e: $(window).scrollable() == [body|html], works for iframes.
|
||||
[Enhancement]
|
||||
- Cleaned the code a bit, specially the comments
|
||||
|
||||
1.3.3
|
||||
[Change]
|
||||
- Changed the licensing from GPL to GPL+MIT.
|
||||
|
||||
1.3.2
|
||||
[Enhancement]
|
||||
- Small improvements to make the code shorter.
|
||||
[Change]
|
||||
- Removed the last argument received by onAfter as it was the same as the 'this' but jqueryfied.
|
||||
|
||||
1.3.1
|
||||
[Feature]
|
||||
- Exposed $.scrollTo.window() to get the element that needs to be animated, to scroll the window.
|
||||
- Added option 'over'.
|
||||
[Enhancement]
|
||||
- Made the code as short as possible.
|
||||
[Change]
|
||||
- Changed the arguments received by onAfter
|
||||
|
||||
1.3
|
||||
[Enhancement]
|
||||
- Added semicolon to the start, for safe file concatenation
|
||||
- Added a limit check, values below 0 or over the maximum are fixed.
|
||||
- Now it should work faster, only one of html or body go through all the processing, instead of both for all browsers.
|
||||
[Fix]
|
||||
- Fixed the behavior for Opera, which seemed to react to both changes on <html> and <body>.
|
||||
- The border is also reduced, when 'margin' is set to true.
|
||||
[Change]
|
||||
- The option speed has been renamed to duration.
|
||||
[Feature]
|
||||
- The duration can be specified with a number as 2nd argument, and the rest of the settings as the third ( like $().animate )
|
||||
- Remade the demo
|
||||
|
||||
1.2.4
|
||||
[Enhancement]
|
||||
- The target can be in the form of { top:x, left:y } allowing different position for each axis.
|
||||
[Feature]
|
||||
- The option 'offset' has been added, to scroll behind or past the target. Can be a number(both axes) or { top:x, left:y }.
|
||||
|
||||
1.2.3
|
||||
[Feature]
|
||||
- Exposed the defaults.
|
||||
[Enhancement]
|
||||
- Made the callback functions receive more parameters.
|
||||
|
||||
1.2.2
|
||||
[Fix]
|
||||
- Fixed a bug, I didn't have to add the scrolled amount if it was body or html.
|
||||
|
||||
1.2
|
||||
[Change]
|
||||
- The option 'onafter' is now called 'onAfter'.
|
||||
[Feature]
|
||||
- Two axes can be scrolled together, this is set with the option 'axis'.
|
||||
- In case 2 axes are chosen, the scrolling can be queued: one scrolls, and then the other.
|
||||
- There's an intermediary event, 'onAfterFirst' called in case the axes are queued, after the first ends.
|
||||
- If the option 'margin' is set to true, the plugin will take in account, the margin of the target(no use if target is a value).
|
||||
@@ -1,11 +0,0 @@
|
||||
/**
|
||||
* jQuery.ScrollTo - Easy element scrolling using jQuery.
|
||||
* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
|
||||
* Dual licensed under MIT and GPL.
|
||||
* Date: 5/25/2009
|
||||
* @author Ariel Flesler
|
||||
* @version 1.4.2
|
||||
*
|
||||
* http://flesler.blogspot.com/2007/10/jqueryscrollto.html
|
||||
*/
|
||||
;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
|
||||
@@ -1,215 +0,0 @@
|
||||
/**
|
||||
* jQuery.ScrollTo
|
||||
* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
|
||||
* Dual licensed under MIT and GPL.
|
||||
* Date: 5/25/2009
|
||||
*
|
||||
* @projectDescription Easy element scrolling using jQuery.
|
||||
* http://flesler.blogspot.com/2007/10/jqueryscrollto.html
|
||||
* Works with jQuery +1.2.6. Tested on FF 2/3, IE 6/7/8, Opera 9.5/6, Safari 3, Chrome 1 on WinXP.
|
||||
*
|
||||
* @author Ariel Flesler
|
||||
* @version 1.4.2
|
||||
*
|
||||
* @id jQuery.scrollTo
|
||||
* @id jQuery.fn.scrollTo
|
||||
* @param {String, Number, DOMElement, jQuery, Object} target Where to scroll the matched elements.
|
||||
* The different options for target are:
|
||||
* - A number position (will be applied to all axes).
|
||||
* - A string position ('44', '100px', '+=90', etc ) will be applied to all axes
|
||||
* - A jQuery/DOM element ( logically, child of the element to scroll )
|
||||
* - A string selector, that will be relative to the element to scroll ( 'li:eq(2)', etc )
|
||||
* - A hash { top:x, left:y }, x and y can be any kind of number/string like above.
|
||||
* - A percentage of the container's dimension/s, for example: 50% to go to the middle.
|
||||
* - The string 'max' for go-to-end.
|
||||
* @param {Number} duration The OVERALL length of the animation, this argument can be the settings object instead.
|
||||
* @param {Object,Function} settings Optional set of settings or the onAfter callback.
|
||||
* @option {String} axis Which axis must be scrolled, use 'x', 'y', 'xy' or 'yx'.
|
||||
* @option {Number} duration The OVERALL length of the animation.
|
||||
* @option {String} easing The easing method for the animation.
|
||||
* @option {Boolean} margin If true, the margin of the target element will be deducted from the final position.
|
||||
* @option {Object, Number} offset Add/deduct from the end position. One number for both axes or { top:x, left:y }.
|
||||
* @option {Object, Number} over Add/deduct the height/width multiplied by 'over', can be { top:x, left:y } when using both axes.
|
||||
* @option {Boolean} queue If true, and both axis are given, the 2nd axis will only be animated after the first one ends.
|
||||
* @option {Function} onAfter Function to be called after the scrolling ends.
|
||||
* @option {Function} onAfterFirst If queuing is activated, this function will be called after the first scrolling ends.
|
||||
* @return {jQuery} Returns the same jQuery object, for chaining.
|
||||
*
|
||||
* @desc Scroll to a fixed position
|
||||
* @example $('div').scrollTo( 340 );
|
||||
*
|
||||
* @desc Scroll relatively to the actual position
|
||||
* @example $('div').scrollTo( '+=340px', { axis:'y' } );
|
||||
*
|
||||
* @dec Scroll using a selector (relative to the scrolled element)
|
||||
* @example $('div').scrollTo( 'p.paragraph:eq(2)', 500, { easing:'swing', queue:true, axis:'xy' } );
|
||||
*
|
||||
* @ Scroll to a DOM element (same for jQuery object)
|
||||
* @example var second_child = document.getElementById('container').firstChild.nextSibling;
|
||||
* $('#container').scrollTo( second_child, { duration:500, axis:'x', onAfter:function(){
|
||||
* alert('scrolled!!');
|
||||
* }});
|
||||
*
|
||||
* @desc Scroll on both axes, to different values
|
||||
* @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } );
|
||||
*/
|
||||
;(function( $ ){
|
||||
|
||||
var $scrollTo = $.scrollTo = function( target, duration, settings ){
|
||||
$(window).scrollTo( target, duration, settings );
|
||||
};
|
||||
|
||||
$scrollTo.defaults = {
|
||||
axis:'xy',
|
||||
duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1
|
||||
};
|
||||
|
||||
// Returns the element that needs to be animated to scroll the window.
|
||||
// Kept for backwards compatibility (specially for localScroll & serialScroll)
|
||||
$scrollTo.window = function( scope ){
|
||||
return $(window)._scrollable();
|
||||
};
|
||||
|
||||
// Hack, hack, hack :)
|
||||
// Returns the real elements to scroll (supports window/iframes, documents and regular nodes)
|
||||
$.fn._scrollable = function(){
|
||||
return this.map(function(){
|
||||
var elem = this,
|
||||
isWin = !elem.nodeName || $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1;
|
||||
|
||||
if( !isWin )
|
||||
return elem;
|
||||
|
||||
var doc = (elem.contentWindow || elem).document || elem.ownerDocument || elem;
|
||||
|
||||
return $.browser.safari || doc.compatMode == 'BackCompat' ?
|
||||
doc.body :
|
||||
doc.documentElement;
|
||||
});
|
||||
};
|
||||
|
||||
$.fn.scrollTo = function( target, duration, settings ){
|
||||
if( typeof duration == 'object' ){
|
||||
settings = duration;
|
||||
duration = 0;
|
||||
}
|
||||
if( typeof settings == 'function' )
|
||||
settings = { onAfter:settings };
|
||||
|
||||
if( target == 'max' )
|
||||
target = 9e9;
|
||||
|
||||
settings = $.extend( {}, $scrollTo.defaults, settings );
|
||||
// Speed is still recognized for backwards compatibility
|
||||
duration = duration || settings.speed || settings.duration;
|
||||
// Make sure the settings are given right
|
||||
settings.queue = settings.queue && settings.axis.length > 1;
|
||||
|
||||
if( settings.queue )
|
||||
// Let's keep the overall duration
|
||||
duration /= 2;
|
||||
settings.offset = both( settings.offset );
|
||||
settings.over = both( settings.over );
|
||||
|
||||
return this._scrollable().each(function(){
|
||||
var elem = this,
|
||||
$elem = $(elem),
|
||||
targ = target, toff, attr = {},
|
||||
win = $elem.is('html,body');
|
||||
|
||||
switch( typeof targ ){
|
||||
// A number will pass the regex
|
||||
case 'number':
|
||||
case 'string':
|
||||
if( /^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(targ) ){
|
||||
targ = both( targ );
|
||||
// We are done
|
||||
break;
|
||||
}
|
||||
// Relative selector, no break!
|
||||
targ = $(targ,this);
|
||||
case 'object':
|
||||
// DOMElement / jQuery
|
||||
if( targ.is || targ.style )
|
||||
// Get the real position of the target
|
||||
toff = (targ = $(targ)).offset();
|
||||
}
|
||||
$.each( settings.axis.split(''), function( i, axis ){
|
||||
var Pos = axis == 'x' ? 'Left' : 'Top',
|
||||
pos = Pos.toLowerCase(),
|
||||
key = 'scroll' + Pos,
|
||||
old = elem[key],
|
||||
max = $scrollTo.max(elem, axis);
|
||||
|
||||
if( toff ){// jQuery / DOMElement
|
||||
attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] );
|
||||
|
||||
// If it's a dom element, reduce the margin
|
||||
if( settings.margin ){
|
||||
attr[key] -= parseInt(targ.css('margin'+Pos)) || 0;
|
||||
attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0;
|
||||
}
|
||||
|
||||
attr[key] += settings.offset[pos] || 0;
|
||||
|
||||
if( settings.over[pos] )
|
||||
// Scroll to a fraction of its width/height
|
||||
attr[key] += targ[axis=='x'?'width':'height']() * settings.over[pos];
|
||||
}else{
|
||||
var val = targ[pos];
|
||||
// Handle percentage values
|
||||
attr[key] = val.slice && val.slice(-1) == '%' ?
|
||||
parseFloat(val) / 100 * max
|
||||
: val;
|
||||
}
|
||||
|
||||
// Number or 'number'
|
||||
if( /^\d+$/.test(attr[key]) )
|
||||
// Check the limits
|
||||
attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max );
|
||||
|
||||
// Queueing axes
|
||||
if( !i && settings.queue ){
|
||||
// Don't waste time animating, if there's no need.
|
||||
if( old != attr[key] )
|
||||
// Intermediate animation
|
||||
animate( settings.onAfterFirst );
|
||||
// Don't animate this axis again in the next iteration.
|
||||
delete attr[key];
|
||||
}
|
||||
});
|
||||
|
||||
animate( settings.onAfter );
|
||||
|
||||
function animate( callback ){
|
||||
$elem.animate( attr, duration, settings.easing, callback && function(){
|
||||
callback.call(this, target, settings);
|
||||
});
|
||||
};
|
||||
|
||||
}).end();
|
||||
};
|
||||
|
||||
// Max scrolling position, works on quirks mode
|
||||
// It only fails (not too badly) on IE, quirks mode.
|
||||
$scrollTo.max = function( elem, axis ){
|
||||
var Dim = axis == 'x' ? 'Width' : 'Height',
|
||||
scroll = 'scroll'+Dim;
|
||||
|
||||
if( !$(elem).is('html,body') )
|
||||
return elem[scroll] - $(elem)[Dim.toLowerCase()]();
|
||||
|
||||
var size = 'client' + Dim,
|
||||
html = elem.ownerDocument.documentElement,
|
||||
body = elem.ownerDocument.body;
|
||||
|
||||
return Math.max( html[scroll], body[scroll] )
|
||||
- Math.min( html[size] , body[size] );
|
||||
|
||||
};
|
||||
|
||||
function both( val ){
|
||||
return typeof val == 'object' ? val : { top:val, left:val };
|
||||
};
|
||||
|
||||
})( jQuery );
|
||||
@@ -1,12 +0,0 @@
|
||||
$(document).ready(function(){
|
||||
/* This code is executed after the DOM has been completely loaded */
|
||||
|
||||
$('nav a,footer a.up').click(function(e){
|
||||
|
||||
// If a link has been clicked, scroll the page to the link's hash target:
|
||||
|
||||
$.scrollTo( this.hash || 0, 1500);
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
});
|
||||
@@ -1,219 +0,0 @@
|
||||
*{
|
||||
/* Universal reset: */
|
||||
margin:0;
|
||||
padding:0;
|
||||
}
|
||||
|
||||
header,footer,
|
||||
article,section,
|
||||
hgroup,nav,
|
||||
figure{
|
||||
/* Giving a display value to the HTML5 rendered elements: */
|
||||
display:block;
|
||||
}
|
||||
|
||||
body{
|
||||
/* Setting the default text color, size, page background and a font stack: */
|
||||
font-size:0.825em;
|
||||
color:#fcfcfc;
|
||||
background-color:#355664;
|
||||
font-family:Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
/* Hyperlink Styles: */
|
||||
|
||||
a, a:visited {
|
||||
color:#0196e3;
|
||||
text-decoration:none;
|
||||
outline:none;
|
||||
}
|
||||
|
||||
a:hover{
|
||||
text-decoration:underline;
|
||||
}
|
||||
|
||||
a img{
|
||||
border:none;
|
||||
}
|
||||
|
||||
/* Headings: */
|
||||
|
||||
h1,h2,h3{
|
||||
font-family:"Myriad Pro","Helvetica Neue",Helvetica,Arial,Sans-Serif;
|
||||
text-shadow:0 1px 1px black;
|
||||
}
|
||||
|
||||
h1{
|
||||
/* The logo text */
|
||||
font-size:3.5em;
|
||||
padding:0.5em 0 0;
|
||||
text-transform:uppercase;
|
||||
}
|
||||
|
||||
h3{
|
||||
/* The slogan text */
|
||||
font-family:forte,"Myriad Pro","Helvetica Neue",Helvetica,Arial,Sans-Serif;
|
||||
font-size:2em;
|
||||
font-weight:normal;
|
||||
margin:0 0 1em;
|
||||
}
|
||||
|
||||
|
||||
h2{
|
||||
font-size:2.2em;
|
||||
font-weight:normal;
|
||||
letter-spacing:0.01em;
|
||||
text-transform:uppercase;
|
||||
}
|
||||
|
||||
p{
|
||||
line-height:1.5em;
|
||||
padding-bottom:1em;
|
||||
}
|
||||
|
||||
.line{
|
||||
/* The dividing line: */
|
||||
height:1px;
|
||||
background-color:#24404c;
|
||||
border-bottom:1px solid #416371;
|
||||
margin:1em 0;
|
||||
overflow:hidden;
|
||||
}
|
||||
|
||||
article .line{
|
||||
/* The dividing line inside of the article is darker: */
|
||||
background-color:#15242a;
|
||||
border-bottom-color:#204656;
|
||||
margin:1.3em 0;
|
||||
}
|
||||
|
||||
footer .line{
|
||||
margin:2em 0;
|
||||
}
|
||||
|
||||
nav{
|
||||
background:url(img/gradient_light.jpg) repeat-x 50% 50% #f8f8f8;
|
||||
padding:0 5px;
|
||||
position:absolute;
|
||||
right:0;
|
||||
top:4em;
|
||||
|
||||
border:1px solid #FCFCFC;
|
||||
|
||||
-moz-box-shadow:0 1px 1px #333333;
|
||||
-webkit-box-shadow:0 1px 1px #333333;
|
||||
box-shadow:0 1px 1px #333333;
|
||||
}
|
||||
|
||||
/* The clearfix hack to clear the floats: */
|
||||
|
||||
.clear:after{
|
||||
content: ".";
|
||||
display: block;
|
||||
height: 0;
|
||||
clear: both;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
/* The navigation styling: */
|
||||
|
||||
nav ul li{
|
||||
display:inline;
|
||||
}
|
||||
|
||||
nav ul li a,
|
||||
nav ul li a:visited{
|
||||
color:#565656;
|
||||
display:block;
|
||||
float:left;
|
||||
font-size:1.25em;
|
||||
font-weight:bold;
|
||||
margin:5px 2px;
|
||||
padding:7px 10px 4px;
|
||||
text-shadow:0 1px 1px white;
|
||||
text-transform:uppercase;
|
||||
}
|
||||
|
||||
nav ul li a:hover{
|
||||
text-decoration:none;
|
||||
background-color:#f0f0f0;
|
||||
}
|
||||
|
||||
nav, article, nav ul li a,figure{
|
||||
/* Applying CSS3 rounded corners: */
|
||||
-moz-border-radius:10px;
|
||||
-webkit-border-radius:10px;
|
||||
border-radius:10px;
|
||||
}
|
||||
|
||||
/* Article styles: */
|
||||
|
||||
#page{
|
||||
width:960px;
|
||||
margin:0 auto;
|
||||
position:relative;
|
||||
}
|
||||
|
||||
article{
|
||||
background-color:#213E4A;
|
||||
margin:3em 0;
|
||||
padding:20px;
|
||||
|
||||
text-shadow:0 2px 0 black;
|
||||
}
|
||||
|
||||
figure{
|
||||
border:3px solid #142830;
|
||||
float:right;
|
||||
height:300px;
|
||||
margin-left:15px;
|
||||
overflow:hidden;
|
||||
width:500px;
|
||||
}
|
||||
|
||||
figure:hover{
|
||||
-moz-box-shadow:0 0 2px #4D7788;
|
||||
-webkit-box-shadow:0 0 2px #4D7788;
|
||||
box-shadow:0 0 2px #4D7788;
|
||||
}
|
||||
|
||||
figure img{
|
||||
margin-left:-60px;
|
||||
}
|
||||
|
||||
/* Footer styling: */
|
||||
|
||||
footer{
|
||||
margin-bottom:30px;
|
||||
text-align:center;
|
||||
font-size:0.825em;
|
||||
}
|
||||
|
||||
|
||||
footer p{
|
||||
margin-bottom:-2.5em;
|
||||
position:relative;
|
||||
}
|
||||
|
||||
footer a,footer a:visited{
|
||||
color:#cccccc;
|
||||
background-color:#213e4a;
|
||||
display:block;
|
||||
padding:2px 4px;
|
||||
z-index:100;
|
||||
position:relative;
|
||||
}
|
||||
|
||||
footer a:hover{
|
||||
text-decoration:none;
|
||||
background-color:#142830;
|
||||
}
|
||||
|
||||
footer a.by{
|
||||
float:left;
|
||||
|
||||
}
|
||||
|
||||
footer a.up{
|
||||
float:right;
|
||||
}
|
||||
@@ -1,139 +0,0 @@
|
||||
<!DOCTYPE html> <!-- The new doctype -->
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Coding A CSS3 & HTML5 One Page Template | Tutorialzine demo</title>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="styles.css" />
|
||||
|
||||
<!-- Internet Explorer HTML5 enabling code: -->
|
||||
|
||||
<!--[if IE]>
|
||||
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
||||
|
||||
<style type="text/css">
|
||||
.clear {
|
||||
zoom: 1;
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<![endif]-->
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<section id="page"> <!-- Defining the #page section with the section tag -->
|
||||
|
||||
<header> <!-- Defining the header section of the page with the appropriate tag -->
|
||||
|
||||
<hgroup>
|
||||
<h1>Your Logo</h1>
|
||||
<h3>and a fancy slogan</h3>
|
||||
</hgroup>
|
||||
|
||||
<nav class="clear"> <!-- The nav link semantically marks your main site navigation -->
|
||||
<ul>
|
||||
<li><a href="#article1">Photoshoot</a></li>
|
||||
<li><a href="#article2">Sweet Tabs</a></li>
|
||||
<li><a href="#article3">Navigation Menu</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</header>
|
||||
|
||||
<section id="articles"> <!-- A new section with the articles -->
|
||||
|
||||
<!-- Article 1 start -->
|
||||
|
||||
<div class="line"></div> <!-- Dividing line -->
|
||||
|
||||
<article id="article1"> <!-- The new article tag. The id is supplied so it can be scrolled into view. -->
|
||||
<h2>Photoshoot Effect</h2>
|
||||
|
||||
<div class="line"></div>
|
||||
|
||||
<div class="articleBody clear">
|
||||
|
||||
<figure> <!-- The figure tag marks data (usually an image) that is part of the article -->
|
||||
<a href="http://tutorialzine.com/2010/02/photo-shoot-css-jquery/"><img src="http://tutorialzine.com/img/featured/641.jpg" width="620" height="340" /></a>
|
||||
</figure>
|
||||
|
||||
<p>In this tutorial, we are creating a photo shoot effect with our just-released PhotoShoot jQuery plug-in. With it you can convert a regular div on the page into a photo shooting stage simulating a camera-like feel.</p>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer luctus quam quis nibh fringilla sit amet consectetur lectus malesuada. Sed nec libero erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc mi nisi, rhoncus ut vestibulum ac, sollicitudin quis lorem. Duis felis dui, vulputate nec adipiscing nec, interdum vel tortor. Sed gravida, erat nec rutrum tincidunt, metus mauris imperdiet nunc, et elementum tortor nunc at eros. Donec malesuada congue molestie. Suspendisse potenti. Vestibulum cursus congue sem et feugiat. Morbi quis elit odio. </p>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<!-- Article 1 end -->
|
||||
|
||||
|
||||
<!-- Article 2 start -->
|
||||
|
||||
<div class="line"></div>
|
||||
|
||||
<article id="article2">
|
||||
<h2>Sweet AJAX Tabs</h2>
|
||||
|
||||
<div class="line"></div>
|
||||
|
||||
<div class="articleBody clear">
|
||||
<figure>
|
||||
<a href="http://tutorialzine.com/2010/01/sweet-tabs-jquery-ajax-css/"><img src="http://tutorialzine.com/img/featured/633.jpg" width="620" height="340" /></a>
|
||||
</figure>
|
||||
|
||||
<p>Here we are making sweet AJAX-powered tabs with CSS3 and the newly released version 1.4 of jQuery.</p>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer luctus quam quis nibh fringilla sit amet consectetur lectus malesuada. Sed nec libero erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc mi nisi, rhoncus ut vestibulum ac, sollicitudin quis lorem. Duis felis dui, vulputate nec adipiscing nec, interdum vel tortor. Sed gravida, erat nec rutrum tincidunt, metus mauris imperdiet nunc, et elementum tortor nunc at eros. Donec malesuada congue molestie. Suspendisse potenti. Vestibulum cursus congue sem et feugiat. Morbi quis elit odio. </p>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<!-- Article 2 end -->
|
||||
|
||||
<!-- Article 3 start -->
|
||||
|
||||
<div class="line"></div>
|
||||
|
||||
<article id="article3">
|
||||
<h2>Halftone Navigation Menu</h2>
|
||||
|
||||
<div class="line"></div>
|
||||
|
||||
<div class="articleBody clear">
|
||||
<figure>
|
||||
<a href="http://tutorialzine.com/2010/01/halftone-navigation-menu-jquery-css/"><img src="http://tutorialzine.com/img/featured/610.jpg" width="620" height="340" /></a>
|
||||
</figure>
|
||||
|
||||
<p>Today we are making a CSS3 & jQuery halftone-style navigation menu, which will allow you to display animated halftone-style shapes in accordance with the navigation links, and will provide a simple editor for creating additional shapes as well.</p>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer luctus quam quis nibh fringilla sit amet consectetur lectus malesuada. Sed nec libero erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc mi nisi, rhoncus ut vestibulum ac, sollicitudin quis lorem. Duis felis dui, vulputate nec adipiscing nec, interdum vel tortor. Sed gravida, erat nec rutrum tincidunt, metus mauris imperdiet nunc, et elementum tortor nunc at eros. Donec malesuada congue molestie. Suspendisse potenti. Vestibulum cursus congue sem et feugiat. Morbi quis elit odio. </p>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<!-- Article 3 end -->
|
||||
|
||||
|
||||
</section>
|
||||
|
||||
<footer> <!-- Marking the footer section -->
|
||||
|
||||
<div class="line"></div>
|
||||
|
||||
<p>Copyright 2010 - YourSite.com</p> <!-- Change the copyright notice -->
|
||||
|
||||
<a href="#" class="up">Go UP</a>
|
||||
<a href="http://tutorialzine.com/2010/02/html5-css3-website-template/" class="by">Template by Tutorialzine</a>
|
||||
|
||||
|
||||
</footer>
|
||||
|
||||
</section> <!-- Closing the #page section -->
|
||||
|
||||
<!-- JavaScript Includes -->
|
||||
|
||||
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
|
||||
<script src="jquery.scrollTo-1.4.2/jquery.scrollTo-min.js"></script>
|
||||
<script src="script.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,43 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Halftone Navigation Menu With jQuery & CSS3 | Tutorialzine demo</title>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="styles.css" />
|
||||
|
||||
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
|
||||
|
||||
<script type="text/javascript" src="script.js"></script>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<h1>Halftone Navigation Menu With jQuery & CSS3</h1>
|
||||
<h2>View the <a href="http://tutorialzine.com/2010/01/halftone-navigation-menu-jquery-css/">original tutorial »</a></h2>
|
||||
|
||||
|
||||
<div id="main">
|
||||
|
||||
<div id="navigation">
|
||||
<ul class="menuUL">
|
||||
<!-- The class names that are assigned to the links correspond to name of the shape that is shown on hover: -->
|
||||
<li><a href="#" class="house">Home</a></li>
|
||||
<li><a href="#" class="wrench">Services</a></li>
|
||||
<li><a href="#" class="envelope">Contact</a></li>
|
||||
<li><a href="#" class="info">About</a></li>
|
||||
</ul>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div id="stage">
|
||||
<!-- The dot divs are shown here -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="tutInfo">This is a tutorialzine demo. View the <a href="http://tutorialzine.com/2010/01/halftone-navigation-menu-jquery-css/">original tutorial</a>, or download the <a href="demo.zip">source files</a>.</p>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 703 B |
|
Before Width: | Height: | Size: 513 B |
@@ -1,121 +0,0 @@
|
||||
/* Set serviceMode to true to create your own shapes: */
|
||||
var serviceMode = false;
|
||||
|
||||
$(document).ready(function(){
|
||||
/* This code is executed after the DOM has been completely loaded */
|
||||
|
||||
var str=[];
|
||||
var perRow = 16;
|
||||
|
||||
/* Generating the dot divs: */
|
||||
|
||||
for(var i=0;i<192;i++)
|
||||
{
|
||||
str.push('<div class="dot" id="d-'+i+'" />');
|
||||
}
|
||||
|
||||
/* Joining the array into a string and adding it to the inner html of the stage div: */
|
||||
|
||||
$('#stage').html(str.join(''));
|
||||
|
||||
/* Using the hover method: */
|
||||
|
||||
$('#navigation li a').hover(function(e){
|
||||
|
||||
/* serviceDraw is a cut-out version of the draw function, used for shape editing and composing: */
|
||||
|
||||
if(serviceMode)
|
||||
serviceDraw($(this).attr('class'));
|
||||
else
|
||||
draw($(this).attr('class'));
|
||||
}, function(e){
|
||||
|
||||
});
|
||||
|
||||
/* Caching the dot divs into a variable for performance: */
|
||||
dots = $('.dot');
|
||||
|
||||
if(serviceMode)
|
||||
{
|
||||
/* If we are in service mode, show borders around the dot divs, add the export link, and listen for clicks: */
|
||||
|
||||
dots.css({
|
||||
border:'1px solid black',
|
||||
width:dots.eq(0).width()-2,
|
||||
height:dots.eq(0).height()-2,
|
||||
cursor:'pointer'
|
||||
})
|
||||
|
||||
$('<div/>').css({
|
||||
position:'absolute',
|
||||
bottom:-20,
|
||||
right:0
|
||||
}).html('<a href="" onclick="outputString();return false;">[Export Shape]</a>').appendTo('#stage');
|
||||
|
||||
dots.click(function(){
|
||||
$(this).toggleClass('active');
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
var shapes={
|
||||
|
||||
/* Each shape is described by an array of points. You can add your own shapes here,
|
||||
just don't forget to add a coma after each array, except for the last one */
|
||||
|
||||
house:[22,37,38,39,52,53,54,55,56,67,68,69,70,71,72,73,82,83,84,85,86,87,88,89,90,99,100,104,105,115,116,120,121,131,132,136,137,147,148,150,151,152,153,163,164,166,167,168,169],
|
||||
wrench:[22,23,24,25,26,27,38,39,40,41,42,43,54,55,58,59,70,71,86,87,88,89,101,102,103,104,105,116,117,118,131,132,133,146,147,148,163],
|
||||
envelope:[34,35,36,37,38,39,40,41,42,43,44,50,51,52,58,59,60,66,68,69,73,74,76,82,85,86,88,89,92,98,102,103,104,108,114,119,124,130,140,146,147,148,149,150,151,152,153,154,155,156],
|
||||
info:[22,23,38,39,69,70,71,86,87,102,103,118,119,134,135,150,151,166,167,168]
|
||||
}
|
||||
|
||||
var stopCounter = 0;
|
||||
var dots;
|
||||
|
||||
function draw(shape)
|
||||
{
|
||||
/* This function draws a shape from the shapes object */
|
||||
|
||||
stopCounter++;
|
||||
var currentCounter = stopCounter;
|
||||
|
||||
dots.removeClass('active').css('opacity',0);
|
||||
|
||||
$.each(shapes[shape],function(i,j){
|
||||
setTimeout(function(){
|
||||
|
||||
/* If a different shape animaton has been started during the showing of the current one, exit the function */
|
||||
if(currentCounter!=stopCounter) return false;
|
||||
|
||||
dots.eq(j).addClass('active').fadeTo('slow',0.4);
|
||||
|
||||
/* The fade animation is scheduled for 10*i millisecond in the future: */
|
||||
},10*i);
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
function serviceDraw(shape)
|
||||
{
|
||||
/* A cut out version of the draw function, used in service mode */
|
||||
|
||||
dots.removeClass('active');
|
||||
|
||||
$.each(shapes[shape],function(i,j){
|
||||
dots.eq(j).addClass('active');
|
||||
});
|
||||
}
|
||||
|
||||
function outputString()
|
||||
{
|
||||
/* Outputs the positions of the active dot divs as a comma-separated string: */
|
||||
|
||||
var str=[];
|
||||
$('.dot.active').each(function(){
|
||||
|
||||
str.push(this.id.replace('d-',''));
|
||||
})
|
||||
|
||||
prompt('Insert this string as an array in the shapes object',str.join(','));
|
||||
}
|
||||
@@ -1,148 +0,0 @@
|
||||
body,h1,h2,h3,p,quote,small,form,input,ul,li,ol,label{
|
||||
/* Simple page reset */
|
||||
margin:0;
|
||||
padding:0;
|
||||
}
|
||||
|
||||
body{
|
||||
/* Setting default text color, background and a font stack */
|
||||
color:#cccccc;
|
||||
font-size:0.825em;
|
||||
background: url(img/background.jpg) no-repeat center top #252525;
|
||||
font-family:Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
.menuUL li{
|
||||
/* This will arrange the LI-s next to each other */
|
||||
display:inline;
|
||||
}
|
||||
|
||||
.menuUL li a,.menuUL li a:visited{
|
||||
/* Styling the hyperlinks of the menu as buttons */
|
||||
|
||||
float:left;
|
||||
font-weight:bold;
|
||||
background:url(img/button_bg.jpg) repeat-x center bottom #666666;
|
||||
|
||||
/* display:block allows for additinal CSS rules to take effect, such as paddings: */
|
||||
display:block;
|
||||
border:1px solid #4D4D4D;
|
||||
color:#CCCCCC;
|
||||
border-top-color:#565656;
|
||||
|
||||
padding:4px 6px;
|
||||
margin:4px 5px;
|
||||
height:16px;
|
||||
|
||||
|
||||
/* Setting a CSS3 box shadow around the button */
|
||||
|
||||
-moz-box-shadow:0 0 1px black;
|
||||
-webkit-box-shadow:0 0 1px black;
|
||||
box-shadow:0 0 1px black;
|
||||
|
||||
/* CSS3 text shadow */
|
||||
text-shadow:0 1px black;
|
||||
}
|
||||
|
||||
.menuUL li a:hover{
|
||||
/* On hover show the top, lighter, part of the background: */
|
||||
background-position:center top;
|
||||
text-decoration:none;
|
||||
}
|
||||
|
||||
#navigation{
|
||||
/* The navigation menu bar: */
|
||||
background:#222222;
|
||||
border:1px solid #111111;
|
||||
float:left;
|
||||
padding:5px 10px;
|
||||
}
|
||||
|
||||
#navigation,.menuUL li a{
|
||||
/* CSS3 rounded corners for both the navigation bar and the buttons: */
|
||||
-moz-border-radius:4px;
|
||||
-webkit-border-radius:4px;
|
||||
-khtml-border-radius:4px;
|
||||
border-radius:4px;
|
||||
}
|
||||
|
||||
#stage{
|
||||
/* The stage contains the individual divs that comprise the halftone icon: */
|
||||
height:300px;
|
||||
position:absolute;
|
||||
right:50px;
|
||||
top:20px;
|
||||
width:400px;
|
||||
}
|
||||
|
||||
.dot{
|
||||
/* The stage contains 192 .dot divs: */
|
||||
float:left;
|
||||
height:25px;
|
||||
width:25px;
|
||||
}
|
||||
|
||||
.dot.active{
|
||||
/* When assigned the active class, the div shows a background image of a dot: */
|
||||
background:url(img/dot.png) no-repeat center center;
|
||||
}
|
||||
|
||||
.clear{
|
||||
/* Old-school clear fix hack to clear the floats: */
|
||||
clear:both;
|
||||
}
|
||||
|
||||
#main{
|
||||
margin:0 auto;
|
||||
position:relative;
|
||||
width:900px;
|
||||
}
|
||||
|
||||
/* The styles below are only necessary for the demo page */
|
||||
|
||||
h1{
|
||||
background:#222222;
|
||||
border-bottom:1px solid black;
|
||||
font-size:1.5em;
|
||||
font-weight:normal;
|
||||
margin-bottom:15px;
|
||||
padding:15px;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size:0.9em;
|
||||
font-weight:normal;
|
||||
padding-right:40px;
|
||||
position:relative;
|
||||
right:0;
|
||||
text-align:right;
|
||||
text-transform:uppercase;
|
||||
top:-48px;
|
||||
}
|
||||
|
||||
a, a:visited {
|
||||
color:#0196e3;
|
||||
text-decoration:none;
|
||||
outline:none;
|
||||
}
|
||||
|
||||
a:hover{
|
||||
text-decoration:underline;
|
||||
}
|
||||
|
||||
p.tutInfo{
|
||||
/* The tutorial info on the bottom of the page */
|
||||
padding:10px 0;
|
||||
text-align:center;
|
||||
position:absolute;
|
||||
bottom:0px;
|
||||
background:#222222;
|
||||
border-top:1px solid black;
|
||||
width:100%;
|
||||
}
|
||||
|
||||
h1,h2,p.tutInfo{
|
||||
font-family:"Myriad Pro",Arial,Helvetica,sans-serif;
|
||||
}
|
||||
@@ -1,153 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Business Co.</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
|
||||
<link href="css/styles.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
<!--
|
||||
function MM_preloadImages() { //v3.0
|
||||
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
|
||||
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
|
||||
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
|
||||
}
|
||||
|
||||
function MM_swapImgRestore() { //v3.0
|
||||
var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
|
||||
}
|
||||
|
||||
function MM_findObj(n, d) { //v4.01
|
||||
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
|
||||
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
|
||||
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
|
||||
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
|
||||
if(!x && d.getElementById) x=d.getElementById(n); return x;
|
||||
}
|
||||
|
||||
function MM_swapImage() { //v3.0
|
||||
var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
|
||||
if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</head>
|
||||
<body onload="MM_preloadImages('images/btn_1_over.jpg','images/btn_2_over.jpg','images/btn_3_over.jpg','images/btn_4_over.jpg','images/btn_5_over.jpg', 'images/btn_6_over.jpg');">
|
||||
<!-- Save for Web Slices (index.psd) -->
|
||||
<table width="775" height="700" border="0" align="center" cellpadding="0" cellspacing="0" id="table_01">
|
||||
<tr>
|
||||
<td width="59" height="0" nowrap="nowrap"></td>
|
||||
<td width="19" height="0" nowrap="nowrap"></td>
|
||||
<td width="4" height="0" nowrap="nowrap"></td>
|
||||
<td width="23" height="0" nowrap="nowrap"></td>
|
||||
<td width="83" height="0" nowrap="nowrap"></td>
|
||||
<td width="3" height="0" nowrap="nowrap"></td>
|
||||
<td width="8" height="0" nowrap="nowrap"></td>
|
||||
<td width="10" height="0" nowrap="nowrap"></td>
|
||||
<td width="31" height="0" nowrap="nowrap"></td>
|
||||
<td width="47" height="0" nowrap="nowrap"></td>
|
||||
<td width="4" height="0" nowrap="nowrap"></td>
|
||||
<td width="3" height="0" nowrap="nowrap"></td>
|
||||
<td width="98" height="0" nowrap="nowrap"></td>
|
||||
<td width="3" height="0" nowrap="nowrap"></td>
|
||||
<td width="66" height="0" nowrap="nowrap"></td>
|
||||
<td width="31" height="0" nowrap="nowrap"></td>
|
||||
<td width="10" height="0" nowrap="nowrap"></td>
|
||||
<td width="3" height="0" nowrap="nowrap"></td>
|
||||
<td width="3" height="0" nowrap="nowrap"></td>
|
||||
<td width="5" height="0" nowrap="nowrap"></td>
|
||||
<td width="89" height="0" nowrap="nowrap"></td>
|
||||
<td width="3" height="0" nowrap="nowrap"></td>
|
||||
<td width="15" height="0" nowrap="nowrap"></td>
|
||||
<td width="57" height="0" nowrap="nowrap"></td>
|
||||
<td width="21" height="0" nowrap="nowrap"></td>
|
||||
<td width="17" height="0" nowrap="nowrap"></td>
|
||||
<td width="60" height="0" nowrap="nowrap"></td>
|
||||
<td width="0" height="0"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="59" height="651" rowspan="15">
|
||||
<img src="images/main.jpg" width="59" height="651" alt="" /></td>
|
||||
<td width="561" height="33" colspan="22" align="left" valign="middle" bgcolor="#efefef" class="text3" style="padding-left:20px">SEPTEMBER 29, 2009 </td>
|
||||
<td width="95" height="33" colspan="3" align="left" valign="top"><a href="#"><img src="images/client_login.jpg" alt="" width="95" height="33" border="0" /></a></td>
|
||||
<td width="60" height="651" rowspan="15">
|
||||
<img src="images/main-03.jpg" width="60" height="651" alt="" /></td>
|
||||
<td width="0" height="33" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="656" height="21" colspan="25" align="left" valign="top" nowrap="nowrap" bgcolor="#a7a7a7"></td>
|
||||
<td width="0" height="21" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="23" height="17" colspan="2" align="left" valign="top" nowrap="nowrap" bgcolor="#a7a7a7"></td>
|
||||
<td width="106" height="17" colspan="2" align="left" valign="top" bgcolor="#a7a7a7"><a href="index.html"><img src="images/btn_1.jpg" alt="" name="btn_1" width="106" height="17" border="0" id="btn_1" onmouseover="MM_swapImage('btn_1','','images/btn_1_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
|
||||
<td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7">
|
||||
<img src="images/lines.jpg" width="3" height="17" alt="" /></td>
|
||||
<td width="100" height="17" colspan="5" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_2.jpg" alt="" name="btn_2" width="100" height="17" border="0" id="btn_2" onmouseover="MM_swapImage('btn_2','','images/btn_2_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
|
||||
<td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7">
|
||||
<img src="images/lines-07.jpg" width="3" height="17" alt="" /></td>
|
||||
<td width="98" height="17" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_3.jpg" alt="" name="btn_3" width="98" height="17" border="0" id="btn_3" onmouseover="MM_swapImage('btn_3','','images/btn_3_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
|
||||
<td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7">
|
||||
<img src="images/lines-09.jpg" width="3" height="17" alt="" /></td>
|
||||
<td width="107" height="17" colspan="3" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_4.jpg" alt="" name="btn_4" width="107" height="17" border="0" id="btn_4" onmouseover="MM_swapImage('btn_4','','images/btn_4_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
|
||||
<td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7">
|
||||
<img src="images/lines-11.jpg" width="3" height="17" alt="" /></td>
|
||||
<td width="97" height="17" colspan="3" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_5.jpg" alt="" name="btn_5" width="97" height="17" border="0" id="btn_5" onmouseover="MM_swapImage('btn_5','','images/btn_5_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
|
||||
<td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7">
|
||||
<img src="images/lines-13.jpg" width="3" height="17" alt="" /></td>
|
||||
<td width="93" height="17" colspan="3" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_6.jpg" alt="" name="btn_6" width="93" height="17" border="0" id="btn_6" onmouseover="MM_swapImage('btn_6','','images/btn_6_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
|
||||
<td width="17" height="17" align="left" valign="top" nowrap="nowrap" bgcolor="#a7a7a7"></td>
|
||||
<td width="0" height="17" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="656" height="19" colspan="25" align="left" valign="top" nowrap="nowrap" bgcolor="#a7a7a7"></td>
|
||||
<td width="0" height="19" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="656" height="240" colspan="25" align="left" valign="top">
|
||||
<img src="images/main-15.jpg" width="656" height="240" alt="" /></td>
|
||||
<td width="0" height="240" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="656" height="321" colspan="25" rowspan="10" align="center" valign="middle" nowrap="nowrap" bgcolor="#efefef" class="text1">Content Page</td>
|
||||
<td width="0" height="7" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="0" height="43" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="0" height="56" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="0" height="26" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="0" height="12" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="0" height="17" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="0" height="23" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="0" height="22" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="0" height="58" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="0" height="57" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="775" height="49" colspan="27" align="center" valign="middle" class="text2" style="background:url(images/b_footer.jpg)"><a href="index.html">HOME</a> | <a href="contentpage.html">ABOUT US</a> | <a href="contentpage.html">SERVICES</a> | <a href="contentpage.html">SOLUTIONS</a> | <a href="contentpage.html">SUPPORT</a> | <a href="contentpage.html">CONTACTS</a><br />
|
||||
<span class="text3">Copyright © Your Company Name</span><br/>
|
||||
Design by <a href="http://www.templatesbox.com" target="_blank" class="adv">Templates</a> Box. Create a <a href="http://www.wix.com" target="_blank" class="adv">free website</a>.
|
||||
</td>
|
||||
<td width="0" height="49" nowrap="nowrap"></td>
|
||||
</tr>
|
||||
</table>
|
||||
<!-- End Save for Web Slices -->
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,160 +0,0 @@
|
||||
body{
|
||||
padding:0px;
|
||||
margin:0px;
|
||||
background:#c7c7c7;
|
||||
color:#848484;
|
||||
font:10px/14px Tahoma, sans-serif;
|
||||
}
|
||||
|
||||
div, p, ul, h2, h3, h4, img, form{padding:0px; margin:0px;}
|
||||
ul{list-style-type:none;}
|
||||
|
||||
.clear{
|
||||
clear:both;
|
||||
}
|
||||
|
||||
.frame {
|
||||
border: 1px solid #D5E6E0;
|
||||
}
|
||||
|
||||
.text1 {
|
||||
font: 11px/14px "Trebuchet MS", Arial, Helvetica, sans-serif;
|
||||
color:#000;
|
||||
font-weight:bold;
|
||||
}
|
||||
.text2 {
|
||||
font: 11px/14px Tahoma, Geneva, sans-serif;
|
||||
color:#000;
|
||||
font-weight:normal;
|
||||
}
|
||||
.text3 {
|
||||
font: 10px/14px Tahoma, Geneva, sans-serif;
|
||||
color:#000;
|
||||
font-weight:normal;
|
||||
}
|
||||
|
||||
.text4 {
|
||||
font: 10px/12px Tahoma, Geneva, sans-serif;
|
||||
color:#052578;
|
||||
font-weight:bold;
|
||||
}
|
||||
.text5 {
|
||||
font: 10px/12px Tahoma, Geneva, sans-serif;
|
||||
color:#052578;
|
||||
font-weight:bold;
|
||||
}
|
||||
|
||||
|
||||
a:link {
|
||||
font: 11px/14px Tahoma, Geneva, sans-serif;
|
||||
color:#000;
|
||||
font-weight:normal;
|
||||
text-decoration:none;
|
||||
}
|
||||
|
||||
a:visited{
|
||||
font: 11px/14px Tahoma, Geneva, sans-serif;
|
||||
color:#000;
|
||||
font-weight:normal;
|
||||
text-decoration:none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
font: 11px/14px Tahoma, Geneva, sans-serif;
|
||||
color:#000;
|
||||
font-weight:normal;
|
||||
text-decoration:underline;
|
||||
}
|
||||
|
||||
a.a:link {
|
||||
font: 10px/14px Tahoma, Geneva, sans-serif;
|
||||
color:#19a1cb;
|
||||
font-weight:normal;
|
||||
text-decoration:underline;
|
||||
}
|
||||
|
||||
a.a:visited{
|
||||
font: 10px/14px Tahoma, Geneva, sans-serif;
|
||||
color:#19a1cb;
|
||||
font-weight:normal;
|
||||
text-decoration:underline;
|
||||
}
|
||||
|
||||
a.a:hover {
|
||||
font: 10px/14px Tahoma, Geneva, sans-serif;
|
||||
color:#000;
|
||||
font-weight:normal;
|
||||
text-decoration:none;
|
||||
}
|
||||
|
||||
a.b:link {
|
||||
font: 10px/18px Tahoma, Geneva, sans-serif;
|
||||
color:#848484;
|
||||
font-weight:normal;
|
||||
text-decoration:underline;
|
||||
}
|
||||
|
||||
a.b:visited{
|
||||
font: 10px/18px Tahoma, Geneva, sans-serif;
|
||||
color:#848484;
|
||||
font-weight:normal;
|
||||
text-decoration:underline;
|
||||
}
|
||||
|
||||
a.b:hover {
|
||||
font: 10px/18px Tahoma, Geneva, sans-serif;
|
||||
color:#000;
|
||||
font-weight:normal;
|
||||
text-decoration:none;
|
||||
}
|
||||
|
||||
a.c:link {
|
||||
font: 10px/12px Tahoma, Geneva, sans-serif;
|
||||
color:#FFF;
|
||||
font-weight:normal;
|
||||
text-decoration:none;
|
||||
}
|
||||
|
||||
a.c:visited{
|
||||
font: 10px/12px Tahoma, Geneva, sans-serif;
|
||||
color:#FFF;
|
||||
font-weight:normal;
|
||||
text-decoration:none;
|
||||
}
|
||||
|
||||
a.c:hover {
|
||||
font: 10px/12px Tahoma, Geneva, sans-serif;
|
||||
color:#FFF;
|
||||
font-weight:normal;
|
||||
text-decoration:underline;
|
||||
}
|
||||
|
||||
a.d:link {
|
||||
font: 10px/12px Tahoma, Geneva, sans-serif;
|
||||
color:#FFF;
|
||||
font-weight:normal;
|
||||
text-decoration:none;
|
||||
}
|
||||
|
||||
a.d:visited{
|
||||
font: 10px/12px Tahoma, Geneva, sans-serif;
|
||||
color:#FFF;
|
||||
font-weight:normal;
|
||||
text-decoration:none;
|
||||
}
|
||||
|
||||
a.d:hover {
|
||||
font: 10px/12px Tahoma, Geneva, sans-serif;
|
||||
color:#FFF;
|
||||
font-weight:normal;
|
||||
text-decoration:underline;
|
||||
}
|
||||
|
||||
input, textarea, select{
|
||||
border:#fff 1px solid;
|
||||
background-color:#d6e6e0;
|
||||
font:10px/12px Tahoma, sans-serif; color:#000;
|
||||
}
|
||||
a.adv:link {text-decoration: none; font-weight:bold; color:#000;}
|
||||
a.adv:hover {text-decoration: none; font-weight:bold; color:#000;}
|
||||
a.adv:visited {text-decoration: none; font-weight:bold; color:#000;}
|
||||
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 1009 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 921 B |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 888 B |
|
Before Width: | Height: | Size: 1004 B |
|
Before Width: | Height: | Size: 1014 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 884 B |
|
Before Width: | Height: | Size: 1002 B |
|
Before Width: | Height: | Size: 872 B |
|
Before Width: | Height: | Size: 990 B |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 315 B |
|
Before Width: | Height: | Size: 315 B |
|
Before Width: | Height: | Size: 315 B |
|
Before Width: | Height: | Size: 315 B |
|
Before Width: | Height: | Size: 315 B |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 733 B |
|
Before Width: | Height: | Size: 711 B |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 608 B |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 668 B |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
@@ -1,197 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Business Co.</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<link href="css/styles.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
<!--
|
||||
function MM_preloadImages() { //v3.0
|
||||
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
|
||||
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
|
||||
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
|
||||
}
|
||||
|
||||
function MM_swapImgRestore() { //v3.0
|
||||
var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
|
||||
}
|
||||
|
||||
function MM_findObj(n, d) { //v4.01
|
||||
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
|
||||
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
|
||||
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
|
||||
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
|
||||
if(!x && d.getElementById) x=d.getElementById(n); return x;
|
||||
}
|
||||
|
||||
function MM_swapImage() { //v3.0
|
||||
var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
|
||||
if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</head>
|
||||
<body onload="MM_preloadImages('images/btn_1_over.jpg','images/btn_2_over.jpg','images/btn_3_over.jpg','images/btn_4_over.jpg','images/btn_5_over.jpg', 'images/btn_6_over.jpg')">
|
||||
<!-- Save for Web Slices (index.psd) -->
|
||||
<table width="775" height="700" border="0" align="center" cellpadding="0" cellspacing="0" id="Table_01">
|
||||
<tr>
|
||||
<td width="59" height="0" nowrap></td>
|
||||
<td width="19" height="0" nowrap></td>
|
||||
<td width="4" height="0" nowrap></td>
|
||||
<td width="23" height="0" nowrap></td>
|
||||
<td width="83" height="0" nowrap></td>
|
||||
<td width="3" height="0" nowrap></td>
|
||||
<td width="8" height="0" nowrap></td>
|
||||
<td width="10" height="0" nowrap></td>
|
||||
<td width="31" height="0" nowrap></td>
|
||||
<td width="47" height="0" nowrap></td>
|
||||
<td width="4" height="0" nowrap></td>
|
||||
<td width="3" height="0" nowrap></td>
|
||||
<td width="98" height="0" nowrap></td>
|
||||
<td width="3" height="0" nowrap></td>
|
||||
<td width="66" height="0" nowrap></td>
|
||||
<td width="31" height="0" nowrap></td>
|
||||
<td width="10" height="0" nowrap></td>
|
||||
<td width="3" height="0" nowrap></td>
|
||||
<td width="3" height="0" nowrap></td>
|
||||
<td width="5" height="0" nowrap></td>
|
||||
<td width="89" height="0" nowrap></td>
|
||||
<td width="3" height="0" nowrap></td>
|
||||
<td width="15" height="0" nowrap></td>
|
||||
<td width="57" height="0" nowrap></td>
|
||||
<td width="21" height="0" nowrap></td>
|
||||
<td width="17" height="0" nowrap></td>
|
||||
<td width="60" height="0" nowrap></td>
|
||||
<td width="0" height="0"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="59" height="651" rowspan="15">
|
||||
<img src="images/main.jpg" width="59" height="651" alt="" /></td>
|
||||
<td width="561" height="33" colspan="22" align="left" valign="middle" bgcolor="#EFEFEF" class="text3" style="padding-left:20px">SEPTEMBER 29, 2009 </td>
|
||||
<td width="95" height="33" colspan="3" align="left" valign="top"><a href="#"><img src="images/client_login.jpg" alt="" width="95" height="33" border="0" /></a></td>
|
||||
<td width="60" height="651" rowspan="15">
|
||||
<img src="images/main-03.jpg" width="60" height="651" alt="" /></td>
|
||||
<td width="0" height="33" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="656" height="21" colspan="25" align="left" valign="top" nowrap bgcolor="#A7A7A7"></td>
|
||||
<td width="0" height="21" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="23" height="17" colspan="2" align="left" valign="top" nowrap bgcolor="#A7A7A7"></td>
|
||||
<td width="106" height="17" colspan="2" align="left" valign="top" bgcolor="#A7A7A7"><a href="index.html"><img src="images/btn_1.jpg" alt="" name="btn_1" width="106" height="17" border="0" id="btn_1" onmouseover="MM_swapImage('btn_1','','images/btn_1_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
|
||||
<td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7">
|
||||
<img src="images/lines.jpg" width="3" height="17" alt="" /></td>
|
||||
<td width="100" height="17" colspan="5" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_2.jpg" alt="" name="btn_2" width="100" height="17" border="0" id="btn_2" onmouseover="MM_swapImage('btn_2','','images/btn_2_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
|
||||
<td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7">
|
||||
<img src="images/lines-07.jpg" width="3" height="17" alt="" /></td>
|
||||
<td width="98" height="17" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_3.jpg" alt="" name="btn_3" width="98" height="17" border="0" id="btn_3" onmouseover="MM_swapImage('btn_3','','images/btn_3_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
|
||||
<td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7">
|
||||
<img src="images/lines-09.jpg" width="3" height="17" alt="" /></td>
|
||||
<td width="107" height="17" colspan="3" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_4.jpg" alt="" name="btn_4" width="107" height="17" border="0" id="btn_4" onmouseover="MM_swapImage('btn_4','','images/btn_4_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
|
||||
<td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7">
|
||||
<img src="images/lines-11.jpg" width="3" height="17" alt="" /></td>
|
||||
<td width="97" height="17" colspan="3" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_5.jpg" alt="" name="btn_5" width="97" height="17" border="0" id="btn_5" onmouseover="MM_swapImage('btn_5','','images/btn_5_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
|
||||
<td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7">
|
||||
<img src="images/lines-13.jpg" width="3" height="17" alt="" /></td>
|
||||
<td width="93" height="17" colspan="3" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_6.jpg" alt="" name="btn_6" width="93" height="17" border="0" id="btn_6" onmouseover="MM_swapImage('btn_6','','images/btn_6_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
|
||||
<td width="17" height="17" align="left" valign="top" nowrap bgcolor="#A7A7A7"></td>
|
||||
<td width="0" height="17" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="656" height="19" colspan="25" align="left" valign="top" nowrap bgcolor="#A7A7A7"></td>
|
||||
<td width="0" height="19" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="656" height="240" colspan="25" align="left" valign="top">
|
||||
<img src="images/main-15.jpg" width="656" height="240" alt="" /></td>
|
||||
<td width="0" height="240" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="656" height="7" colspan="25" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
|
||||
<td width="0" height="7" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="19" height="314" rowspan="9" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
|
||||
<td width="209" height="43" colspan="8" align="left" valign="top" bgcolor="#EFEFEF">
|
||||
<img src="images/welcome.jpg" width="209" height="43" alt="" /></td>
|
||||
<td width="174" height="43" colspan="5" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
|
||||
<td width="31" height="314" rowspan="9" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
|
||||
<td width="185" height="43" colspan="8" align="left" valign="top" bgcolor="#EFEFEF">
|
||||
<img src="images/news.jpg" width="185" height="43" alt="" /></td>
|
||||
<td width="38" height="314" colspan="2" rowspan="9" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
|
||||
<td width="0" height="43" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="121" height="82" colspan="5" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF">
|
||||
<img src="images/welcome-18.jpg" width="121" height="82" alt="" /></td>
|
||||
<td width="10" height="94" rowspan="3" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
|
||||
<td width="252" height="94" colspan="7" rowspan="3" align="left" valign="top" bgcolor="#EFEFEF"><span class="text1">Lorem ipsum dolor sit amet, consectetuer</span><br />
|
||||
Nam eu nulla. Donec lobortis purus vel urna. Nunc laoreet lacinia nunc. In volutpat sodales ipsum. Sed vestibulum. <a href="#" class="a">Integer in ante. Sed posuere ligula</a> rhoncus erat. Fusce urna dui, sollicitudin ac, pulvinar quis</td>
|
||||
<td width="21" height="56" colspan="4" align="left" valign="top" bgcolor="#EFEFEF">
|
||||
<img src="images/news-19.jpg" width="21" height="56" alt="" /></td>
|
||||
<td width="164" height="56" colspan="4" align="left" valign="top" bgcolor="#EFEFEF" style="padding-top:5px"><p class="text1">September 29
|
||||
</p>
|
||||
<p><a href="#" class="a">Integer in ante. Sed posuere ligula </a>rhoncus erat. Fusce urna dui </p></td>
|
||||
<td width="0" height="56" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="21" height="55" colspan="4" rowspan="3" align="left" valign="top" bgcolor="#EFEFEF"><img src="images/news-20.jpg" width="21" height="55" alt="" /></td>
|
||||
<td width="164" height="55" colspan="4" rowspan="3" align="left" valign="top" bgcolor="#EFEFEF" style="padding-top:5px"><span class="text1">September 28
|
||||
</span><br />
|
||||
<a href="#" class="a">Integer in ante. Sed posuere ligula</a> rhoncus erat. Fusce urna dui</td>
|
||||
<td width="0" height="26" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="121" height="12" colspan="5" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
|
||||
<td width="0" height="12" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="162" height="40" colspan="7" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF">
|
||||
<img src="images/services.jpg" width="162" height="40" alt="" /></td>
|
||||
<td width="221" height="40" colspan="6" rowspan="2" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
|
||||
<td width="0" height="17" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="185" height="45" colspan="8" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF">
|
||||
<img src="images/spotlight.jpg" width="185" height="45" alt="" /></td>
|
||||
<td width="0" height="23" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="121" height="80" colspan="5" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF">
|
||||
<img src="images/services-23.jpg" width="121" height="80" alt="" /></td>
|
||||
<td width="10" height="80" rowspan="2" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
|
||||
<td width="252" height="80" colspan="7" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF"><span class="text1">Lorem ipsum dolor sit amet, consectetuer</span><br />
|
||||
<a href="#" class="a">Nam eu nulla. Donec lobortis purus vel urna. Nunc </a>laoreet lacinia nunc. In volutpat sodales ipsum. Sed vestibulum. rhoncus erat. Fusce urna dui, sollicitudin ac, pulvinar quis</td>
|
||||
<td width="0" height="22" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="16" height="115" colspan="3" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF">
|
||||
<img src="images/spotlight-24.jpg" width="16" height="115" alt="" /></td>
|
||||
<td width="169" height="115" colspan="5" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF" style="line-height:18px; padding-top:3px"><a href="#" class="b">Morbi volutpat leo in ligula. Inter vel</a><br />
|
||||
<a href="#" class="b">magna. sagittis. Fusce elit ligula, </a><br />
|
||||
<a href="#" class="b">sodales sit amet, tincid unt in, Fusce </a><br />
|
||||
<a href="#" class="b">interdum. Sed laoreet. Aenean. Sed </a><br />
|
||||
l<a href="#" class="b">aoreet. magna. sagittis. Fusce elit</a></td>
|
||||
<td width="0" height="58" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="27" height="57" colspan="2" align="left" valign="top" bgcolor="#EFEFEF">
|
||||
<img src="images/services-25.jpg" width="27" height="57" alt="" /></td>
|
||||
<td width="356" height="57" colspan="11" align="left" valign="top" bgcolor="#EFEFEF" style="line-height:18px; padding-top:8px"><a href="#" class="b">Morbi volutpat leo in ligula. Inter vel magna. sagittis. Fusce elit ligula, sodales </a><br />
|
||||
<a href="#" class="b">sit amet, tincid unt in, Fusce interdum. Sed laoreet. Aenean. Sed laoreet. </a></td>
|
||||
<td width="0" height="57" nowrap></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="775" height="49" colspan="27" align="center" valign="middle" class="text2" style="background:url(images/b_footer.jpg)"><a href="index.html">HOME</a> | <a href="contentpage.html">ABOUT US</a> | <a href="contentpage.html">SERVICES</a> | <a href="contentpage.html">SOLUTIONS</a> | <a href="contentpage.html">SUPPORT</a> | <a href="contentpage.html">CONTACTS</a><br />
|
||||
<span class="text3">Copyright © Your Company Name</span><br />
|
||||
Design by <a href="http://www.templatesbox.com" target="_blank" class="adv">Templates</a> Box. Create a <a href="http://www.wix.com" target="_blank" class="adv">free website</a>.
|
||||
</td>
|
||||
<td width="0" height="49" nowrap></td>
|
||||
</tr>
|
||||
</table>
|
||||
<!-- End Save for Web Slices -->
|
||||
</body>
|
||||
</html>
|
||||
|
Before Width: | Height: | Size: 493 KiB |
@@ -1,86 +0,0 @@
|
||||
<!-- saved from url=(0022)http://internet.e-mail -->
|
||||
<html>
|
||||
<head>
|
||||
<title>TemplatesBox.com | Terms of Use</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
</head>
|
||||
|
||||
<body bgcolor="#5E717F" text="#000000" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
|
||||
<table width="700" cellspacing="0" cellpadding="8" align="center" bgcolor="#BED5E2" style="border-collapse:collapse;">
|
||||
<tr>
|
||||
<td bgcolor="#567280" style="border-top-width:1px; border-right-width:1px; border-left-width:1px; border-top-color:rgb(216,216,216); border-right-color:rgb(216,216,216); border-left-color:rgb(216,216,216); border-top-style:solid; border-right-style:solid; border-left-style:solid;"><font color="#C2DCEB" size="2" face="Verdana,Arial"><b>Templates</b></font><font color="#FF9900" size="2" face="Verdana,Arial"><b>Box</b></font><font color="#FF9B05" size="2" face="Verdana,Arial"><b>
|
||||
</b></font><font color="#E3E3E3" size="2" face="Verdana,Arial">|<b> Terms of Use</b></font></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td bgcolor="#A1BBCA" style="border-right-width:1px; border-left-width:1px; border-right-color:rgb(216,216,216); border-left-color:rgb(216,216,216); border-right-style:solid; border-left-style:solid;">
|
||||
<table align="center" cellpadding="0" cellspacing="0" width="98%">
|
||||
<tr>
|
||||
<td>
|
||||
<p style="line-height:115%; margin-top:0; margin-bottom:0;"><font face="Verdana,Arial" color="#354D59"><span style="font-size:8pt;">By
|
||||
downloading a template from TemplatesBox.com you agree to the following
|
||||
Terms of Use: </span></font>
|
||||
<p style="line-height:115%; margin-top:0; margin-bottom:0;"><font face="Verdana,Arial" color="#354D59"><span style="font-size:8pt;">Our
|
||||
web templates may be used for your own and/or your clients' websites,
|
||||
but you may not sell/offer for free our templates in any sort of collection,
|
||||
such as distributing to a third party via CD, diskette, or letting others
|
||||
to download off your websites etc.<br>
|
||||
<br>
|
||||
Link back to www.templatesbox.com is required and always appreciated.
|
||||
Also, please visit the<br>
|
||||
</span></font><a href="http://www.templatesbox.com/linkus.htm" target="_blank"><font face="Verdana,Arial" color="#354D59"><b><span style="font-size:8pt;">Link
|
||||
Us</span></b></font></a><font face="Verdana,Arial" color="#354D59"><span style="font-size:8pt;"> section.<br>
|
||||
<br>
|
||||
The templates are offered "as is" without warranty of any kind,
|
||||
either expressed or implied. TemplatesBox.com will not be liable for any
|
||||
damage or loss of data whatsoever due to downloading or using a template.
|
||||
In no event shall TemplatesBox.com be liable for any damages including,
|
||||
but not limited to, direct, indirect, special, incidental or consequential
|
||||
damages or other losses arising out of the use of or inability to use
|
||||
the templates and/or information from TemplatesBox.com.<br>
|
||||
<br>
|
||||
TemplatesBox.com team reserves the right to change or modify these terms
|
||||
with no prior notice.</span></font></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td bgcolor="#567280" style="border-right-width:1px; border-left-width:1px; border-right-color:rgb(216,216,216); border-left-color:rgb(216,216,216); border-right-style:solid; border-left-style:solid;"><font size="2" face="Verdana,Arial" color="#E3E3E3"><b>Featured
|
||||
Partners</b></font></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td bgcolor="#A1BBCA" style="border-right-width:1px; border-bottom-width:1px; border-left-width:1px; border-right-color:rgb(216,216,216); border-bottom-color:rgb(216,216,216); border-left-color:rgb(216,216,216); border-right-style:solid; border-bottom-style:solid; border-left-style:solid;" height="235">
|
||||
<table align="center" cellpadding="0" cellspacing="0" width="98%">
|
||||
<tr>
|
||||
<td>
|
||||
<p><a href="http://www.specialtemplates.com" target="_blank"><b><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F">Premium Website
|
||||
Templates</font></b></a><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br>
|
||||
Over 9000 High-end Website templates, Flash intros and Logo templates.<b><a href="http://www.freshtemplates.com" target="_blank"><br>
|
||||
<br>
|
||||
</a></b></font><a href="http://www.freephotosbank.com" target="_blank"><b><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F">Free
|
||||
Photos, Free Stock Photography</font></b></a><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><b><br></b>
|
||||
</font><FONT face=Verdana color=#2d444f size=2><FONT size=2><FONT
|
||||
face=Verdana><FONT color=#2d444f>1000's of FREE high quality stock
|
||||
Photos!</FONT></FONT></FONT></FONT><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br>
|
||||
<br>
|
||||
</font><A
|
||||
href="http://www.webmasterschannel.com" target=_blank><FONT face=Verdana><FONT color=#2d444f><B><FONT size=2>Webmaster Resources &
|
||||
Directory</FONT></B></FONT></FONT></A><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br>
|
||||
</font><FONT size=2><FONT face=Verdana><FONT color=#2d444f>A large web directory with webmaster
|
||||
resources.</FONT></FONT></FONT><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br>
|
||||
<br>
|
||||
</font><A href="http://www.photovations.com"
|
||||
target=_blank><FONT face=Verdana color=#000000
|
||||
size=2><FONT face=Verdana color=#2d444f size=2><STRONG>Photovations.com</STRONG></FONT></FONT></A><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br>
|
||||
</font><FONT face=Verdana color=#2d444f size=2><FONT size=2><FONT
|
||||
face=Verdana><FONT color=#2d444f>Online Photo Sharing. Free Image
|
||||
Hosting</FONT></FONT></FONT></FONT></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,9 +0,0 @@
|
||||
<html>
|
||||
<body>
|
||||
|
||||
<h2>Norwegian Mountain Trip</h2>
|
||||
<img border="0" src="images/pulpit.jpg" alt="Pulpit rock" width="304" height="228" />
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
Before Width: | Height: | Size: 1009 B |
|
Before Width: | Height: | Size: 74 KiB |
@@ -1,10 +0,0 @@
|
||||
<html>
|
||||
<body>
|
||||
|
||||
<h1>My First Heading</h1>
|
||||
|
||||
<p>My first paragraph.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,99 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset=utf-8 />
|
||||
<meta name="viewport" content="width=620" />
|
||||
<title>HTML5 Demo: data-*</title>
|
||||
<link rel="stylesheet" href="/css/html5demos.css" type="text/css" />
|
||||
<script src="/js/h5utils.js"></script></head>
|
||||
<body>
|
||||
<section id="wrapper">
|
||||
<header>
|
||||
<h1>data-*</h1>
|
||||
</header><style>
|
||||
#test {
|
||||
padding: 10px;
|
||||
border: 1px solid #ccc;
|
||||
margin: 20px 0;
|
||||
}
|
||||
pre {
|
||||
overflow-x: auto;
|
||||
padding: 10px;
|
||||
border: 1px dashed #ccc;
|
||||
background: #fff;
|
||||
font-size: 12px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<article>
|
||||
<section>
|
||||
<p>The <code>data-[name]</code> attribute on elements can now be accessed directly via the DOM using <code>element.dataset.[attr]</code>.</p>
|
||||
<p>Try openning the Web Console and editing <code>element.dataset</code> directly: <br /><code>element.dataset.foo = 'bar';</code></p>
|
||||
</section>
|
||||
<p id="status">Not connected</p>
|
||||
<section>
|
||||
<div id="test" data-name="rem" data-height="short">This element has data</div>
|
||||
<input type="button" value="Show data" id="show" />
|
||||
<input type="button" value="Change data via dataset" id="change1" />
|
||||
<input type="button" value="change data via setAttribute" id="change2" />
|
||||
</section>
|
||||
<pre><code id="element">[click buttons above to show element html]</code></pre>
|
||||
</article>
|
||||
<script>
|
||||
(function () {
|
||||
|
||||
function show() {
|
||||
code.innerHTML = test.outerHTML.replace(/[<>]/g, function (m) {
|
||||
return { '<': '<', '>': '>' }[m];
|
||||
});
|
||||
|
||||
for (var prop in test.dataset) {
|
||||
code.innerHTML += '\nel.dataset.' + prop + ' = "' + test.dataset[prop] + '"';
|
||||
}
|
||||
}
|
||||
|
||||
var state = document.getElementById('status'),
|
||||
code = document.getElementById('element');
|
||||
|
||||
var test = window.element = document.getElementById('test');
|
||||
|
||||
if (test.dataset === undefined) {
|
||||
state.innerHTML = 'dataset not supported';
|
||||
state.className = 'fail';
|
||||
} else {
|
||||
state.className = 'success';
|
||||
state.innerHTML = 'element.dataset supported';
|
||||
}
|
||||
|
||||
addEvent(document.getElementById('show'), 'click', function () {
|
||||
show();
|
||||
});
|
||||
|
||||
addEvent(document.getElementById('change1'), 'click', function () {
|
||||
test.dataset.name = 'via el.dataset';
|
||||
show();
|
||||
});
|
||||
|
||||
addEvent(document.getElementById('change2'), 'click', function () {
|
||||
test.setAttribute('data-name', 'via setAttribute');
|
||||
show();
|
||||
});
|
||||
|
||||
|
||||
})();
|
||||
</script>
|
||||
<footer><a href="/">HTML5 demos</a>/<a id="built" href="http://twitter.com/rem">@rem built this</a>/<a href="#view-source">view source</a></footer>
|
||||
</section>
|
||||
<a href="http://github.com/remy/html5demos"><img style="position: absolute; top: 0; left: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_left_darkblue_121621.png" alt="Fork me on GitHub" /></a>
|
||||
<script src="/js/prettify.packed.js"></script>
|
||||
<script>
|
||||
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
||||
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
||||
</script>
|
||||
<script>
|
||||
try {
|
||||
var pageTracker = _gat._getTracker("UA-1656750-18");
|
||||
pageTracker._trackPageview();
|
||||
} catch(err) {}</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,19 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>POST example</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1> POST example </h1>
|
||||
<form action="index.html" method="POST">
|
||||
<input type="text" name="name" value="a simple name"/> <br/>
|
||||
<input type="text" name="text" value="a tiny text"/>
|
||||
<input type="submit" value="POST"/>
|
||||
</form>
|
||||
|
||||
<form action="index.html" method="GET">
|
||||
<input type="text" name="name" value="a simple name"/> <br/>
|
||||
<input type="text" name="text" value="a tiny text"/>
|
||||
<input type="submit" value="GET"/>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,5 +0,0 @@
|
||||
Eiffel Web Nino is and HTTPD server. It's a work in progress, so maybe it will be refactored.
|
||||
The goal of is to provide a simple web server for development (like Java, Python and Ruby provide)
|
||||
|
||||
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {HTTP_SERVER_CONFIGURATION}."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
HTTP_SERVER_CONFIGURATION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
http_server_port := 80
|
||||
max_tcp_clients := 100
|
||||
socket_accept_timeout := 1_000
|
||||
socket_connect_timeout := 5_000
|
||||
document_root := "htdocs"
|
||||
force_single_threaded := False
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
Server_details : STRING = "Server : NINO Eiffel Server"
|
||||
|
||||
document_root: STRING assign set_document_root
|
||||
http_server_name: detachable STRING assign set_http_server_name
|
||||
http_server_port: INTEGER assign set_http_server_port
|
||||
max_tcp_clients: INTEGER assign set_max_tcp_clients
|
||||
socket_accept_timeout: INTEGER assign set_socket_accept_timeout
|
||||
socket_connect_timeout: INTEGER assign set_socket_connect_timeout
|
||||
force_single_threaded: BOOLEAN assign set_force_single_threaded
|
||||
|
||||
is_verbose: BOOLEAN assign set_is_verbose
|
||||
-- Display verbose message to the output?
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_http_server_name (v: like http_server_name)
|
||||
do
|
||||
http_server_name := v
|
||||
end
|
||||
|
||||
set_http_server_port (v: like http_server_port)
|
||||
do
|
||||
http_server_port := v
|
||||
end
|
||||
|
||||
set_document_root (v: like document_root)
|
||||
do
|
||||
document_root := v
|
||||
end
|
||||
|
||||
set_max_tcp_clients (v: like max_tcp_clients)
|
||||
do
|
||||
max_tcp_clients := v
|
||||
end
|
||||
|
||||
set_socket_accept_timeout (v: like socket_accept_timeout)
|
||||
do
|
||||
socket_accept_timeout := v
|
||||
end
|
||||
|
||||
set_socket_connect_timeout (v: like socket_connect_timeout)
|
||||
do
|
||||
socket_connect_timeout := v
|
||||
end
|
||||
|
||||
set_force_single_threaded (v: like force_single_threaded)
|
||||
do
|
||||
force_single_threaded := v
|
||||
end
|
||||
|
||||
set_is_verbose (b: BOOLEAN)
|
||||
-- Set `is_verbose' to `b'
|
||||
do
|
||||
is_verbose := b
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2011, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
@@ -1,199 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {HTTP_CONNECTION_HANDLER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
HTTP_CONNECTION_HANDLER
|
||||
|
||||
inherit
|
||||
HTTP_HANDLER
|
||||
redefine
|
||||
make
|
||||
end
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_server: like server)
|
||||
-- Creates a {HTTP_CONNECTION_HANDLER}, assigns the main_server and sets the current_request_message to empty.
|
||||
--
|
||||
-- `a_server': The main server object
|
||||
do
|
||||
Precursor (a_server)
|
||||
reset
|
||||
end
|
||||
|
||||
reset
|
||||
do
|
||||
has_error := False
|
||||
create method.make_empty
|
||||
create uri.make_empty
|
||||
create request_header.make_empty
|
||||
create request_header_map.make (10)
|
||||
remote_info := Void
|
||||
end
|
||||
|
||||
feature -- Execution
|
||||
|
||||
receive_message_and_send_reply (client_socket: TCP_STREAM_SOCKET)
|
||||
local
|
||||
l_remote_info: detachable like remote_info
|
||||
do
|
||||
create l_remote_info
|
||||
if attached client_socket.peer_address as l_addr then
|
||||
l_remote_info.addr := l_addr.host_address.host_address
|
||||
l_remote_info.hostname := l_addr.host_address.host_name
|
||||
l_remote_info.port := l_addr.port
|
||||
remote_info := l_remote_info
|
||||
end
|
||||
|
||||
analyze_request_message (client_socket)
|
||||
if has_error then
|
||||
check catch_bad_incoming_connection: False end
|
||||
if is_verbose then
|
||||
log ("ERROR: invalid HTTP incoming request")
|
||||
end
|
||||
else
|
||||
process_request (Current, client_socket)
|
||||
end
|
||||
reset
|
||||
end
|
||||
|
||||
feature -- Request processing
|
||||
|
||||
process_request (a_handler: HTTP_CONNECTION_HANDLER; a_socket: TCP_STREAM_SOCKET)
|
||||
-- Process request ...
|
||||
require
|
||||
no_error: not has_error
|
||||
a_handler_attached: a_handler /= Void
|
||||
a_uri_attached: a_handler.uri /= Void
|
||||
a_method_attached: a_handler.method /= Void
|
||||
a_header_map_attached: a_handler.request_header_map /= Void
|
||||
a_header_text_attached: a_handler.request_header /= Void
|
||||
a_socket_attached: a_socket /= Void
|
||||
deferred
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
request_header: STRING
|
||||
-- Header' source
|
||||
|
||||
request_header_map : HASH_TABLE [STRING,STRING]
|
||||
-- Contains key:value of the header
|
||||
|
||||
has_error: BOOLEAN
|
||||
-- Error occurred during `analyze_request_message'
|
||||
|
||||
method: STRING
|
||||
-- http verb
|
||||
|
||||
uri: STRING
|
||||
-- http endpoint
|
||||
|
||||
version: detachable STRING
|
||||
-- http_version
|
||||
--| unused for now
|
||||
|
||||
remote_info: detachable TUPLE [addr: STRING; hostname: STRING; port: INTEGER]
|
||||
-- Information related to remote client
|
||||
|
||||
feature -- Parsing
|
||||
|
||||
analyze_request_message (a_socket: TCP_STREAM_SOCKET)
|
||||
-- Analyze message extracted from `a_socket' as HTTP request
|
||||
require
|
||||
input_readable: a_socket /= Void and then a_socket.is_open_read
|
||||
local
|
||||
end_of_stream : BOOLEAN
|
||||
pos,n : INTEGER
|
||||
line : detachable STRING
|
||||
k, val: STRING
|
||||
txt: STRING
|
||||
l_is_verbose: BOOLEAN
|
||||
do
|
||||
create txt.make (64)
|
||||
request_header := txt
|
||||
|
||||
if attached next_line (a_socket) as l_request_line and then not l_request_line.is_empty then
|
||||
txt.append (l_request_line)
|
||||
txt.append_character ('%N')
|
||||
analyze_request_line (l_request_line)
|
||||
else
|
||||
has_error := True
|
||||
end
|
||||
|
||||
l_is_verbose := is_verbose
|
||||
|
||||
if not has_error or l_is_verbose then
|
||||
-- if `is_verbose' we can try to print the request, even if it is a bad HTTP request
|
||||
from
|
||||
line := next_line (a_socket)
|
||||
until
|
||||
line = Void or end_of_stream
|
||||
loop
|
||||
n := line.count
|
||||
if l_is_verbose then
|
||||
log (line)
|
||||
end
|
||||
pos := line.index_of (':',1)
|
||||
if pos > 0 then
|
||||
k := line.substring (1, pos-1)
|
||||
if line [pos+1].is_space then
|
||||
pos := pos + 1
|
||||
end
|
||||
if line [n] = '%R' then
|
||||
n := n - 1
|
||||
end
|
||||
val := line.substring (pos + 1, n)
|
||||
request_header_map.put (val, k)
|
||||
end
|
||||
txt.append (line)
|
||||
txt.append_character ('%N')
|
||||
if line.is_empty or else line [1] = '%R' then
|
||||
end_of_stream := True
|
||||
else
|
||||
line := next_line (a_socket)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
analyze_request_line (line: STRING)
|
||||
-- Analyze `line' as a HTTP request line
|
||||
require
|
||||
valid_line: line /= Void and then not line.is_empty
|
||||
local
|
||||
pos, next_pos: INTEGER
|
||||
do
|
||||
if is_verbose then
|
||||
log ("%N## Parse HTTP request line ##")
|
||||
log (line)
|
||||
end
|
||||
pos := line.index_of (' ', 1)
|
||||
method := line.substring (1, pos - 1)
|
||||
next_pos := line.index_of (' ', pos + 1)
|
||||
uri := line.substring (pos + 1, next_pos - 1)
|
||||
version := line.substring (next_pos + 1, line.count)
|
||||
has_error := method.is_empty
|
||||
end
|
||||
|
||||
next_line (a_socket: TCP_STREAM_SOCKET): detachable STRING
|
||||
-- Next line fetched from `a_socket' is available.
|
||||
require
|
||||
is_readable: a_socket.is_open_read
|
||||
do
|
||||
if a_socket.socket_ok then
|
||||
a_socket.read_line_thread_aware
|
||||
Result := a_socket.last_string
|
||||
end
|
||||
end
|
||||
|
||||
invariant
|
||||
request_header_attached: request_header /= Void
|
||||
|
||||
note
|
||||
copyright: "2011-2011, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
@@ -1,149 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {HTTP_CONSTANTS}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
HTTP_CONSTANTS
|
||||
|
||||
feature
|
||||
|
||||
http_version_1_1: STRING = "HTTP/1.1"
|
||||
http_version_1_0: STRING = "HTTP/1.0"
|
||||
crlf: STRING = "%/13/%/10/"
|
||||
|
||||
feature -- Status codes
|
||||
|
||||
-- 1xx Informational -Request received, continuing process
|
||||
Continue : STRING = "100"
|
||||
Switching_Protocols : STRING = "101"
|
||||
|
||||
|
||||
-- 2xx Success - The action was successfully received, understood, and accepted
|
||||
Ok: STRING = "200"
|
||||
Created : STRING = "201"
|
||||
Accepted : STRING = "202"
|
||||
Non_Authoritative_Information : STRING = "203"
|
||||
No_Content : STRING = "204"
|
||||
Reset_Content : STRING = "205"
|
||||
Parcial_Content : STRING = "206"
|
||||
|
||||
|
||||
-- 3xx Redirection - Further Action must be taken in order to complete the request
|
||||
Multiple_Choices : STRING = "300"
|
||||
Moved_Permanently: STRING = "301"
|
||||
Found : STRING = "302"
|
||||
See_Other : STRING = "303"
|
||||
Not_Modified : STRING = "304"
|
||||
Use_Proxy : STRING = "305"
|
||||
Temporary_Redirect : STRING = "307"
|
||||
|
||||
|
||||
--4xx Client Error - The request contains bad syntax or cannot be fulfilled
|
||||
Bad_Request : STRING = "400"
|
||||
Unauthorized : STRING = "401"
|
||||
Payment_Required : STRING = "402"
|
||||
Forbidden : STRING = "403"
|
||||
Not_Found : STRING = "404"
|
||||
Method_Not_Allowed : STRING = "405"
|
||||
Not_Acceptable : STRING = "406"
|
||||
Proxy_Authentication_Required : STRING = "407"
|
||||
Request_Time_out : STRING = "408"
|
||||
Conflict : STRING = "409"
|
||||
Gone : STRING = "410"
|
||||
Length_Required : STRING = "411"
|
||||
Precondition_Failed : STRING = "412"
|
||||
Request_Entity_Too_Large : STRING = "413"
|
||||
Request_URI_Too_Large : STRING = "414"
|
||||
Unsupported_Media_Type : STRING = "415"
|
||||
Requested_range_not_satisfiable : STRING = "416"
|
||||
Expectation_Failed : STRING = "417"
|
||||
|
||||
|
||||
--5xx Server Error - The server failed to fulfill an apparently valid request
|
||||
server_error: STRING = "500"
|
||||
Internal_Server_Error : STRING = "500"
|
||||
Not_Implemented : STRING = "501"
|
||||
Bad_Gateway : STRING = "502"
|
||||
Service_Unavailable : STRING = "503"
|
||||
Gateway_Time_out : STRING = "504"
|
||||
HTTP_Version_not_supported : STRING = "505"
|
||||
|
||||
|
||||
-- messages
|
||||
ok_message: STRING = "OK"
|
||||
continue_message : STRING = "Continue"
|
||||
not_found_message: STRING = "URI not found"
|
||||
not_implemented_message: STRING = "Not Implemented"
|
||||
|
||||
feature -- content types
|
||||
|
||||
text_html: STRING = "text/html"
|
||||
|
||||
feature -- General Header Fields
|
||||
|
||||
-- There are a few header fields which have general applicability for both request and response messages,
|
||||
-- but which do not apply to the entity being transferred.
|
||||
-- These header fields apply only to the message being transmitted.
|
||||
|
||||
Cache_control : STRING = "Cache-Control"
|
||||
Connection : STRING = "Connection"
|
||||
Date : STRING = "Date"
|
||||
Pragma : STRING = "PRAGMA"
|
||||
Trailer : STRING = "Trailer"
|
||||
Transfer_encoding : STRING = "Transfer-Encoding"
|
||||
Upgrade : STRING = "Upgrade"
|
||||
Via : STRING = "Via"
|
||||
Warning : STRING = "Warning"
|
||||
|
||||
|
||||
feature -- Request Header
|
||||
Accept : STRING = "Accept"
|
||||
Accept_charset : STRING = "Accept-Charset"
|
||||
Accept_encoding : STRING = "Accept-Encoding"
|
||||
Accept_language : STRING = "Accept-Language"
|
||||
Authorization : STRING = "Authorization"
|
||||
Expect : STRING = "Expect"
|
||||
From_header : STRING = "From"
|
||||
Host : STRING = "Host"
|
||||
If_match : STRING = "If-Match"
|
||||
If_modified_since : STRING = "If-Modified-Since"
|
||||
If_none_match : STRING = "If-None-Match"
|
||||
If_range : STRING = "If-Range"
|
||||
If_unmodified_since : STRING = "If-Unmodified-Since"
|
||||
Max_forwards : STRING = "Max-Forwards"
|
||||
Proxy_authorization : STRING = "Proxy-Authorization"
|
||||
Range : STRING = "Range"
|
||||
Referer : STRING = "Referrer"
|
||||
TE : STRING = "TE"
|
||||
User_agent : STRING = "User-Agent"
|
||||
|
||||
|
||||
feature -- Entity Header
|
||||
|
||||
Allow : STRING = "Allow"
|
||||
Content_encoding : STRING = "Content-Encoding"
|
||||
Content_language : STRING = "Content-Language"
|
||||
Content_length : STRING = "Content-Length"
|
||||
Content_location : STRING = "Content-Location"
|
||||
Content_MD5 : STRING = "Content-MD5"
|
||||
Content_range : STRING = "Content-Range"
|
||||
Content_type : STRING = "Content-Type"
|
||||
Expires : STRING = "Expires"
|
||||
Last_modified : STRING = "Last-Modified"
|
||||
|
||||
|
||||
feature -- Http Method
|
||||
Options : STRING = "OPTIONS"
|
||||
Get : STRING = "GET"
|
||||
Head : STRING = "HEAD"
|
||||
Post : STRING = "POST"
|
||||
Put : STRING = "PUT"
|
||||
Delete : STRING = "DELETE"
|
||||
Trace : STRING = "TRACE"
|
||||
Connect : STRING = "CONNECT"
|
||||
note
|
||||
copyright: "2011-2011, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
@@ -1,60 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
Provides features to encode and decode messages
|
||||
]"
|
||||
legal: "See notice at end of class."
|
||||
status: "Community Preview 1.0"
|
||||
date: "$Date: 2009-09-01 19:15:37 -0300 (mar 01 de sep de 2009) $"
|
||||
revision: "$Revision: 80577 $"
|
||||
|
||||
class
|
||||
HTTP_ENCODING_FACILITIES
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
end
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
encode_natural(a_i: NATURAL; a_is_fragmented: BOOLEAN): NATURAL
|
||||
-- Leftshift of the natural (don't use numbers >= 2^31) and subsequent append of the flag bit.
|
||||
-- Use decode_natural and decode_flag for decoding.
|
||||
require
|
||||
no_too_big: a_i < 2147483648
|
||||
do
|
||||
Result := (a_i |<< 1) + a_is_fragmented.to_integer.as_natural_32
|
||||
end
|
||||
|
||||
change_flag(a_i: NATURAL; a_new_flag: BOOLEAN): NATURAL
|
||||
-- Changes the flag to "new_flag" and doesn't change the encoded natural.
|
||||
do
|
||||
Result := (a_i & 0xFFFFFFFE) + a_new_flag.to_integer.as_natural_32
|
||||
end
|
||||
|
||||
decode_natural_and_flag (a_i: NATURAL): TUPLE [NATURAL, BOOLEAN]
|
||||
-- Convenience feature which combines both decodings (natural and flag)
|
||||
do
|
||||
Result := [decode_natural (a_i), decode_flag (a_i)]
|
||||
end
|
||||
|
||||
decode_natural (a_i: NATURAL): NATURAL
|
||||
-- The natural that was encoded in {ENCODING_FACILITIES}.encode_natural.
|
||||
do
|
||||
Result := (a_i |>> 1)
|
||||
end
|
||||
|
||||
decode_flag (a_i: NATURAL): BOOLEAN
|
||||
--`Result': the flag that was encoded in encode_natural
|
||||
do
|
||||
Result := (a_i.bit_and (1) = 1)
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2011, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
@@ -1,234 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {HTTP_CONNECTION_HANDLER}."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
HTTP_HANDLER
|
||||
|
||||
inherit
|
||||
ANY
|
||||
|
||||
HTTP_CONSTANTS
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_server: like server)
|
||||
-- Creates a {HTTP_HANDLER}, assigns the server and initialize various values
|
||||
--
|
||||
-- `a_server': The main server object
|
||||
require
|
||||
a_server_attached: a_server /= Void
|
||||
do
|
||||
server := a_server
|
||||
is_stop_requested := False
|
||||
ensure
|
||||
server_set: a_server ~ server
|
||||
end
|
||||
|
||||
feature -- Output
|
||||
|
||||
log (a_message: READABLE_STRING_8)
|
||||
-- Log `a_message'
|
||||
do
|
||||
io.put_string (a_message)
|
||||
io.put_new_line
|
||||
end
|
||||
|
||||
feature -- Inherited Features
|
||||
|
||||
execute
|
||||
-- <Precursor>
|
||||
-- Creates a socket and connects to the http server.
|
||||
local
|
||||
l_listening_socket: detachable TCP_STREAM_SOCKET
|
||||
l_http_port: INTEGER
|
||||
do
|
||||
launched := False
|
||||
port := 0
|
||||
is_stop_requested := False
|
||||
l_http_port := http_server_port
|
||||
|
||||
if
|
||||
attached http_server_name as l_servername and then
|
||||
attached (create {INET_ADDRESS_FACTORY}).create_from_name (l_servername) as l_addr
|
||||
then
|
||||
create l_listening_socket.make_server_by_address_and_port (l_addr, l_http_port)
|
||||
else
|
||||
create l_listening_socket.make_server_by_port (l_http_port)
|
||||
end
|
||||
|
||||
if not l_listening_socket.is_bound then
|
||||
if is_verbose then
|
||||
log ("Socket could not be bound on port " + l_http_port.out)
|
||||
end
|
||||
else
|
||||
l_http_port := l_listening_socket.port
|
||||
from
|
||||
l_listening_socket.listen (max_tcp_clients)
|
||||
if is_verbose then
|
||||
log ("%NHTTP Connection Server ready on port " + l_http_port.out +" : http://localhost:" + l_http_port.out + "/")
|
||||
end
|
||||
on_launched (l_http_port)
|
||||
until
|
||||
is_stop_requested
|
||||
loop
|
||||
l_listening_socket.accept
|
||||
if not is_stop_requested then
|
||||
if attached l_listening_socket.accepted as l_thread_http_socket then
|
||||
process_connection (l_thread_http_socket)
|
||||
end
|
||||
end
|
||||
is_stop_requested := stop_requested_on_server
|
||||
end
|
||||
l_listening_socket.cleanup
|
||||
check
|
||||
socket_is_closed: l_listening_socket.is_closed
|
||||
end
|
||||
end
|
||||
if launched then
|
||||
on_stopped
|
||||
end
|
||||
if is_verbose then
|
||||
log ("HTTP Connection Server ends.")
|
||||
end
|
||||
rescue
|
||||
log ("HTTP Connection Server shutdown due to exception. Please relaunch manually.")
|
||||
|
||||
if l_listening_socket /= Void then
|
||||
l_listening_socket.cleanup
|
||||
check
|
||||
socket_is_closed: l_listening_socket.is_closed
|
||||
end
|
||||
end
|
||||
if launched then
|
||||
on_stopped
|
||||
end
|
||||
is_stop_requested := True
|
||||
retry
|
||||
end
|
||||
|
||||
process_connection (a_socket: TCP_STREAM_SOCKET)
|
||||
-- Process incoming connection
|
||||
do
|
||||
if is_verbose then
|
||||
log ("Incoming connection...(socket:" + a_socket.descriptor.out + ")")
|
||||
end
|
||||
--| FIXME jfiat [2011/11/03] : should use a Pool of Threads/Handler to process this connection
|
||||
--| also handle permanent connection...?
|
||||
receive_message_and_send_reply (a_socket)
|
||||
a_socket.cleanup
|
||||
if is_verbose then
|
||||
log ("connection completed...")
|
||||
end
|
||||
ensure
|
||||
socket_closed: a_socket.is_closed
|
||||
end
|
||||
|
||||
feature -- Event
|
||||
|
||||
on_launched (a_port: INTEGER)
|
||||
-- Server launched using port `a_port'
|
||||
require
|
||||
not_launched: not launched
|
||||
do
|
||||
launched := True
|
||||
port := a_port
|
||||
ensure
|
||||
launched: launched
|
||||
end
|
||||
|
||||
on_stopped
|
||||
-- Server stopped
|
||||
require
|
||||
launched: launched
|
||||
do
|
||||
launched := False
|
||||
ensure
|
||||
stopped: not launched
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
is_stop_requested: BOOLEAN
|
||||
-- Set true to stop accept loop
|
||||
|
||||
launched: BOOLEAN
|
||||
-- Server launched and listening on `port'
|
||||
|
||||
port: INTEGER
|
||||
-- Listening port.
|
||||
--| 0: not launched
|
||||
|
||||
feature -- Access: configuration
|
||||
|
||||
is_verbose: BOOLEAN
|
||||
-- Is verbose for output messages.
|
||||
do
|
||||
Result := server_configuration.is_verbose
|
||||
end
|
||||
|
||||
force_single_threaded: BOOLEAN
|
||||
do
|
||||
Result := server_configuration.force_single_threaded
|
||||
end
|
||||
|
||||
http_server_name: detachable STRING
|
||||
do
|
||||
Result := server_configuration.http_server_name
|
||||
end
|
||||
|
||||
http_server_port: INTEGER
|
||||
do
|
||||
Result := server_configuration.http_server_port
|
||||
end
|
||||
|
||||
max_tcp_clients: INTEGER
|
||||
do
|
||||
Result := server_configuration.max_tcp_clients
|
||||
end
|
||||
|
||||
feature {NONE} -- Access: server
|
||||
|
||||
server: HTTP_SERVER
|
||||
-- The main server object
|
||||
|
||||
stop_requested_on_server: BOOLEAN
|
||||
-- Stop requested on `server' object
|
||||
do
|
||||
Result := server.stop_requested
|
||||
end
|
||||
|
||||
feature {NONE} -- Access: configuration
|
||||
|
||||
server_configuration: HTTP_SERVER_CONFIGURATION
|
||||
-- The main server's configuration
|
||||
do
|
||||
Result := server.configuration
|
||||
end
|
||||
|
||||
feature -- Status setting
|
||||
|
||||
shutdown
|
||||
-- Stops the thread
|
||||
do
|
||||
is_stop_requested := True
|
||||
end
|
||||
|
||||
feature -- Execution
|
||||
|
||||
receive_message_and_send_reply (client_socket: TCP_STREAM_SOCKET)
|
||||
require
|
||||
socket_attached: client_socket /= Void
|
||||
-- socket_valid: client_socket.is_open_read and then client_socket.is_open_write
|
||||
a_http_socket: not client_socket.is_closed
|
||||
deferred
|
||||
end
|
||||
|
||||
invariant
|
||||
server_attached: server /= Void
|
||||
|
||||
note
|
||||
copyright: "2011-2012, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
@@ -1,56 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {HTTP_SERVER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
HTTP_SERVER
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Initialization
|
||||
|
||||
make (cfg: like configuration)
|
||||
do
|
||||
configuration := cfg
|
||||
end
|
||||
|
||||
setup (a_http_handler: HTTP_HANDLER)
|
||||
require
|
||||
a_http_handler_valid: a_http_handler /= Void
|
||||
do
|
||||
if configuration.is_verbose then
|
||||
log ("%N%N%N")
|
||||
log ("Starting Web Application Server (port="+ configuration.http_server_port.out +"):%N")
|
||||
end
|
||||
stop_requested := False
|
||||
a_http_handler.execute
|
||||
end
|
||||
|
||||
shutdown_server
|
||||
do
|
||||
stop_requested := True
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
configuration: HTTP_SERVER_CONFIGURATION
|
||||
-- Configuration of the server
|
||||
|
||||
stop_requested: BOOLEAN
|
||||
-- Stops the server
|
||||
|
||||
feature -- Output
|
||||
|
||||
log (a_message: READABLE_STRING_8)
|
||||
-- Log `a_message'
|
||||
do
|
||||
io.put_string (a_message)
|
||||
end
|
||||
|
||||
;note
|
||||
copyright: "2011-2011, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
@@ -1,118 +0,0 @@
|
||||
deferred class HTTP_REQUEST_HANDLER
|
||||
|
||||
inherit
|
||||
ANY
|
||||
redefine
|
||||
default_create
|
||||
end
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
default_create
|
||||
do
|
||||
Precursor
|
||||
create request_uri.make_empty
|
||||
create script_name.make_empty
|
||||
create query_string.make_empty
|
||||
create answer
|
||||
create headers.make (0)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
request_uri: STRING
|
||||
-- requested url
|
||||
|
||||
script_name: STRING
|
||||
-- Script name
|
||||
|
||||
query_string: STRING
|
||||
-- Query string
|
||||
|
||||
data: detachable STRING
|
||||
-- the entire request message
|
||||
|
||||
headers : HASH_TABLE [STRING, STRING]
|
||||
-- Provides access to the request's HTTP headers, for example:
|
||||
-- headers["Content-Type"] is "text/plain"
|
||||
|
||||
answer: HTTP_RESPONSE
|
||||
-- reply to this request
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- process the request and create an answer
|
||||
require
|
||||
valid_uri: request_uri /= Void
|
||||
deferred
|
||||
end
|
||||
|
||||
feature -- Recycle
|
||||
|
||||
reset
|
||||
-- reinit the fields
|
||||
do
|
||||
request_uri.wipe_out
|
||||
script_name.wipe_out
|
||||
query_string.wipe_out
|
||||
data := Void
|
||||
answer.reset
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_uri (new_uri: STRING)
|
||||
-- set new URI
|
||||
require
|
||||
valid_uri: new_uri /= Void
|
||||
local
|
||||
p: INTEGER
|
||||
do
|
||||
request_uri := new_uri
|
||||
p := new_uri.index_of ('?', 1)
|
||||
if p > 0 then
|
||||
script_name := new_uri.substring (1, p - 1)
|
||||
query_string := new_uri.substring (p + 1, new_uri.count)
|
||||
else
|
||||
script_name := new_uri.string
|
||||
query_string := ""
|
||||
end
|
||||
end
|
||||
|
||||
set_data (new_data: STRING)
|
||||
-- set new data
|
||||
do
|
||||
data := new_data
|
||||
end
|
||||
|
||||
set_headers ( a_header : HASH_TABLE [STRING, STRING] )
|
||||
do
|
||||
headers := a_header
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
real_filename (fn: STRING): STRING
|
||||
-- Real filename from url-path `fn'
|
||||
--| Find a better design for this piece of code
|
||||
--| Eventually in a spec/$ISE_PLATFORM/ specific cluster
|
||||
do
|
||||
if {PLATFORM}.is_windows then
|
||||
create Result.make_from_string (fn)
|
||||
Result.replace_substring_all ("/", "\")
|
||||
if Result[Result.count] = '\' then
|
||||
Result.remove_tail (1)
|
||||
end
|
||||
else
|
||||
Result := fn
|
||||
if Result[Result.count] = '/' then
|
||||
Result := Result.substring (1, Result.count - 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2011, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
@@ -1,147 +0,0 @@
|
||||
|
||||
class HTTP_RESPONSE
|
||||
|
||||
inherit
|
||||
HTTP_CONSTANTS
|
||||
redefine
|
||||
default_create
|
||||
end
|
||||
|
||||
create
|
||||
default_create
|
||||
|
||||
feature -- creation
|
||||
|
||||
default_create
|
||||
do
|
||||
Precursor
|
||||
set_defaults
|
||||
end
|
||||
|
||||
set_defaults
|
||||
-- Set default values for the reply
|
||||
do
|
||||
status_code := ok
|
||||
create content_length_data.make_empty
|
||||
reason_phrase := ok_message
|
||||
content_type_data := text_html
|
||||
set_reply_text (Void)
|
||||
end
|
||||
|
||||
feature -- Recycle
|
||||
|
||||
reset
|
||||
do
|
||||
set_defaults
|
||||
end
|
||||
|
||||
feature -- response header fields
|
||||
|
||||
status_code: STRING
|
||||
-- status
|
||||
|
||||
content_length_data : STRING
|
||||
-- length
|
||||
|
||||
reason_phrase: STRING
|
||||
-- message, if any
|
||||
|
||||
content_type_data: STRING
|
||||
-- type of content in this reply (eg. text/html)
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_content_length (new_content_length: INTEGER)
|
||||
require
|
||||
positive_or_zero: new_content_length >= 0
|
||||
do
|
||||
content_length_data := new_content_length.out
|
||||
end
|
||||
|
||||
set_status_code (new_status_code: STRING)
|
||||
require
|
||||
not_void: new_status_code /= Void
|
||||
do
|
||||
status_code := new_status_code
|
||||
end
|
||||
|
||||
set_reason_phrase (new_reason_phrase: STRING)
|
||||
require
|
||||
not_void: new_reason_phrase /= Void
|
||||
do
|
||||
reason_phrase := new_reason_phrase
|
||||
end
|
||||
|
||||
set_content_type (new_content_type: STRING)
|
||||
require
|
||||
not_void: new_content_type /= Void
|
||||
do
|
||||
content_type_data := new_content_type
|
||||
end
|
||||
|
||||
feature -- Access: send reply
|
||||
|
||||
reply_header: STRING
|
||||
-- header
|
||||
do
|
||||
Result := http_version_1_1.twin
|
||||
Result.extend (' ')
|
||||
Result.append (status_code)
|
||||
Result.extend (' ')
|
||||
Result.append (reason_phrase)
|
||||
Result.append (crlf)
|
||||
Result.append ({HTTP_SERVER_CONFIGURATION}.Server_details)
|
||||
Result.append (crlf)
|
||||
Result.append (Content_type + ": ")
|
||||
Result.append (content_type_data)
|
||||
Result.append (crlf)
|
||||
Result.append (Content_length + ": ")
|
||||
Result.append (content_length_data)
|
||||
Result.append (crlf)
|
||||
Result.append (crlf)
|
||||
-- TODO: could add the size of data being sent here and
|
||||
-- then keep the connection alive
|
||||
end
|
||||
|
||||
reply_header_continue: STRING
|
||||
-- header
|
||||
do
|
||||
Result := http_version_1_1.twin
|
||||
Result.extend (' ')
|
||||
Result.append (status_code)
|
||||
Result.extend (' ')
|
||||
Result.append (continue_message)
|
||||
Result.append (crlf)
|
||||
Result.append (crlf)
|
||||
-- TODO: could add the size of data being sent here and
|
||||
-- then keep the connection alive
|
||||
end
|
||||
|
||||
reply_text: STRING
|
||||
-- reply text
|
||||
|
||||
feature -- Change element: send reply
|
||||
|
||||
set_reply_text (new_text: detachable STRING)
|
||||
-- text could be Void
|
||||
do
|
||||
if new_text = Void then
|
||||
create reply_text.make_empty
|
||||
else
|
||||
reply_text := new_text
|
||||
end
|
||||
end
|
||||
|
||||
append_reply_text (more_text: STRING)
|
||||
-- add more text to the reply
|
||||
require
|
||||
reply_text /= Void
|
||||
more_text /= Void
|
||||
do
|
||||
reply_text.append (more_text)
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2011, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
@@ -1,18 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {SHARED_URI_CONTENTS_TYPES}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
SHARED_URI_CONTENTS_TYPES
|
||||
feature
|
||||
|
||||
ct_table: URI_CONTENTS_TYPES
|
||||
once
|
||||
create Result.make
|
||||
end
|
||||
note
|
||||
copyright: "2011-2011, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
@@ -1,83 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {TCP_STREAM_SOCKET}."
|
||||
date: "$Date: 2015-02-16 19:53:13 +0100 (lun., 16 févr. 2015) $"
|
||||
revision: "$Revision: 96642 $"
|
||||
|
||||
class
|
||||
TCP_STREAM_SOCKET
|
||||
|
||||
inherit
|
||||
NETWORK_STREAM_SOCKET
|
||||
redefine
|
||||
make
|
||||
end
|
||||
|
||||
create
|
||||
make_server_by_address_and_port,
|
||||
make_server_by_port
|
||||
|
||||
create {NETWORK_STREAM_SOCKET}
|
||||
make_from_descriptor_and_address,
|
||||
make_empty
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make_server_by_address_and_port (a_address: INET_ADDRESS; a_port: INTEGER)
|
||||
-- Create server socket on `a_address' and `a_port'.
|
||||
require
|
||||
valid_port: a_port >= 0
|
||||
do
|
||||
make
|
||||
create address.make_from_address_and_port (a_address, a_port)
|
||||
bind
|
||||
end
|
||||
|
||||
make
|
||||
-- Create a network stream socket.
|
||||
do
|
||||
Precursor
|
||||
set_reuse_address
|
||||
end
|
||||
|
||||
feature -- Basic operation
|
||||
|
||||
send_message (a_msg: STRING)
|
||||
local
|
||||
a_package : PACKET
|
||||
a_data : MANAGED_POINTER
|
||||
c_string : C_STRING
|
||||
do
|
||||
create c_string.make (a_msg)
|
||||
create a_data.make_from_pointer (c_string.item, a_msg.count + 1)
|
||||
create a_package.make_from_managed_pointer (a_data)
|
||||
send (a_package, 1)
|
||||
end
|
||||
|
||||
feature -- Output
|
||||
|
||||
put_readable_string_8 (s: READABLE_STRING_8)
|
||||
-- Write readable string `s' to socket.
|
||||
local
|
||||
ext: C_STRING
|
||||
do
|
||||
create ext.make (s)
|
||||
put_managed_pointer (ext.managed_data, 0, s.count)
|
||||
end
|
||||
|
||||
feature -- Status report
|
||||
|
||||
try_ready_for_reading: BOOLEAN
|
||||
-- Is data available for reading from the socket right now?
|
||||
require
|
||||
socket_exists: exists
|
||||
local
|
||||
retval: INTEGER
|
||||
do
|
||||
retval := c_select_poll_with_timeout (descriptor, True, 0)
|
||||
Result := (retval > 0)
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2015, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||