Yaws

Yaws is a HTTP high perfomance 1.1 webserver particularly well suited for dynamic-content web applications. Two separate modes of operations are supported:

Yaws is entirely written in Erlang, and furthermore it is a multithreaded webserver where one Erlang lightweight process is used to handle each client.

The main advantages of Yaws compared to other Web technologies are performance and elegance. The performance comes from the underlying Erlang system and its ability to handle concurrent processes in an efficent way. Its elegance comes from Erlang as well. Web applications don't have to be written in ugly ad hoc languages.

yaws.hyber.org

The www page for Yaws is yaws.hyber.org. The documentation, examples as well as releases can be found there, and of course, yaws.hyber.org is itself powered by Yaws.

Code is on : http://github.com/klacke/yaws

A mailing list exists at: https://lists.sourceforge.net/lists/listinfo/erlyaws-list

A lot of excellent engineers have contributed to Yaws over the years, we keep a list of all contributors

A high resolution logo created by Tomas Selander exists at yaws.eps

News

To see all the most recent changes and activity in Yaws development, please visit the Yaws github repository.

Mon Nov 4 19:22:42 CET 2013 Yaws 1.98

Wed Oct 16 05:40:25 CEST 2013 Yaws 1.97

Wed Oct 17 19:57:05 CEST 2012 Yaws 1.95

Sun Jun 24 23:47:57 CEST 2012 Yaws 1.94

Wed Jun 20 20:22:11 CEST 2012 Yaws 1.93

Fri Dec 23 22:09:03 CET 2011 Yaws 1.92

Tue Aug 2 15:16:53 CEST 2011 Yaws 1.91

Tue May 24 21:25:00 CEST 2011 Yaws 1.90

Sat Sep 25 13:39:29 CEST 2010 Yaws 1.89

Thu Mar 18 21:51:32 CET 2010 Yaws 1.88

Mon Jan 11 22:09:00 CET 2010 1.87

Sun Dec 6 14:35:33 CET 2009 1.86

Sat Oct 17 22:56:36 CEST 2009 1.85

Sun Jul 5 20:05:00 CEST 2009 1.84

Thu May 28 20:17:10 CEST 2009 Yaws 1.82

Mon Mar 9 21:48:18 CET 2009 Yaws 1.81

Thu Feb 12 22:58:16 CET 2009 Yaws 1.80

Tue Jan 20 20:19:16 CET 2009 version 1.79

Thu Jan 8 22:00:51 CET 2009 version 1.78

Mon Jun 16 22:44:45 CEST 2008 version 1.77

Thu Apr 3 23:13:03 CEST 2008 version 1.76

Sun Feb 3 2008 version 1.75

Sat Dec 29 15:18:12 CET 2007 1.74

Thu Sep 20 15:09:35 CEST 2007 1.73

Wed Sep 19 23:17:47 CEST 2007 1.72

Fri Sep 14 21:52:52 CEST 2007 version 1.71

Thu Sep 6 19:40:28 CEST 2007 version 1.70

Thu Feb 8 16:45:47 CET 2007 version 1.68

Sun Feb 4 16:56:30 CET 2007 version 1.67

Sun Dec 17 20:58:21 CET 2006 version 1.66

Tue Dec 12 10:51:18 CET 2006 version 1.66

Mon Sep 11 19:59:57 CEST 2006 version 1.65

Thu Jul 13 13:07:10 CEST 2006 version 1.64

Sun Jun 11 16:49:13 CEST 2006 version 1.63

Wed Jun 7 22:10:44 CEST 2006 version 1.62

Thu Apr 27 21:40:01 CEST 2006 Version 1.61

Wed Feb 1 23:28:42 CET 2006 Version 1.58

Wed Aug 17 14:54:06 CEST 2005 Version 1.57

Fri Jun 10 16:09:58 CEST 2005, Version 1.55 released. Feature release.

Tue Apr 12 2005, Version 1.54 released. Bugfix release.

Fri Feb 18, 2005 Bugfix release

Mon Feb 14 2005, Version 1.52 released

Wed Dec 15 2004 Version 1.51 released

Sat Dec 11 2004 Version 1.50 released

Thu Sep 2, 2004 Version 1.49 released

  • Bugfixrelease.

  • Webmail fixes by jb, Add original message quoted in reply, Delete email bug fixed, Mailbox already locked bug, Improved attachment handling.

  • Wiki fixes by jb, Made layout of wiki much more configurable using templates and ssi. You must run the script/updateWiki script after updating to this release.

  • Bug found by David Welton, url on the form http://www.x.com?foo had yaws_api:queryval/2 return {nokey, "foo"} which is clearly wrong. New correct val is {"foo", undefined}.

  • two-mode.el contributed by David Welton. Makes it easier to edit files with both erlang and html content. Typically the case for yaws files.

  • cschultz did lots of stuff, Deflate rehaul: Now works with dynamic pages, Multiple dots in yaws file name caused trouble with pathinfo, fixed silly bug with content-range, cache fixes, Have several processes wait for SSL connections, so that one SSL negotiation in progress does not prevent other connections. Also, for the similar reasons, have use a timeout with SSL accepts. timeout are quite arbitrary. They are ok for my low traffic site. Streaming fixes, Rewrite requests with absolute URI to look like requests with a Host header.

  • Small fix with embedded mode (it was completely non-working) by Jimmy Olgeni

  • Addded configure option -with-defaultcharset (klacke)

  • jb fixed a severe bug in ssi, Fixed bug in ssi code. Multichar delims were not handled properly. When a char of the delim string was found in the text it was deleted.

  • patch from Paul Mahon to add PEER_ADDR to cgi env

Mon Jun 7, 2004 Version 1.48 released

  • This release contains both bugfixes as well as som minor new features. There was also a fairly ugly security hole in the example code which describes file uploads found and fixed.

  • A Bug in yaws_api:request_url/1 was found by Einar Karttunen. The function didn't handle well the case with explicit port numbers in the URI. (klacke)

  • Fixed the appmod code so that users of yaws_api:setconf/1 doesn't have to bother with the cahnge in internal representation of appmods. (klacke)

  • Moved phpexe config variable from the sconf to the gconf, it doesn't make sence to have different phpexe paths for different virt servers. Users with old configs will get a warning when tying to specify a phpexe inside a virt server instead of inside the global config area. (klacke)

  • New feature called "yssi". Yaws server side include. It's now possible to let the out/1 function return a tuple {yssi, PathToYawsFile.yaws"}. The new yaws file will be fully expanded, compiled and in general handled as a yaws file. This feature can probably be used to build all kinds of different cool stuff. (klacke)

  • yaws_session_server ttl patch from Rob.Schmersel

  • Patch from Fredrik Linder to make it easier to integrate yaws into apps that don't use the otp application framework at all.

  • As usual updates both to the wiki and the webmail app by (jb)

  • Patch from Jocke Grebeno which handles ssi support for ehtml code, not just ascii. We can now return {ssi, "@@", file.html, [{"FOO", "bar"}, {"BAZ", {ehtml, {p, [], "saab"}}}]} and it returns the expected. Documented is ssi.yaws.

  • Security vulnerability in upload.yaws found by (mbj)

Thu May 27, 2004 Version 1.47 released

  • Appmods were slightly broken in 1.46

Wed May 26, 2004 Version 1.46 released

  • Bugfix release. Several fixes to different parts of the web server. No new features.

  • Debian support (David Welton)

  • Embedded mode fixes (Jimmy Olgeni)

  • Don't create no logs at all when logging is turned off bugfix (Jimmy Olgeni)

  • SSL and large POSTs fix (cschultz)

  • Compression and keep alive fix (cschultz)

  • As usual, several fixes to the wiki and the webmail app (jbevemyr)

  • An XSS vulnerability (lpsmith)

  • Rewrote the url spliting (again) and also backed off from the redir when we get http://www.a.com/ and index.html exists. It's better to ship the file directly instead of sending a redir. (klacke)

  • Reworked (and documented) the appmods a bit (klacke)

  • Added a command line flag (yaws -ls) which lists existing yaws servers and their status on localhost. (klacke)

Fri Apr 16, 2004 Version 1.45 released

  • Minor bugfix release fixing up the some odd bugs introduced in the 1.43 rewite.

Mar 18, 2004 Version 1.43 released

  • This is a major release. Not so much for added functionality as for internal rewrites of the code. The release contains the following:

  • Compression support using zlib. Still experimental. (cschultz)

  • Minor bugfixes in the reverse proxy. This code is still not ready (klacke)

  • Added a specific auth log which logs good and bad HTTP auth requests.

  • QNX port (cschatz@networkadvantage.biz)

  • Beautification of dir listings (cschultz)

  • Never let ehtml generate extra spaces where it is not entirely correct (patch from tomas abrahamsson)

  • Webmail app, Completed support for attachments, proper esacping, faster listing of large mboxes. Added sorting of mails (jb)

  • Date header bug (chandru)

  • postvar put/get bug fixed (hal snyder)

  • Added yaws_api:query_url(Arg) which reconstructs the url from the original GET request.

  • Added the "id = Key" configuration parameter. Earlier when we were running multiple yaws servers on the same machine, they had to run with different uid since yaws was writing temporary files under /tmp/yaws/${uid}. This is now changed and if we want 2 _different_ yaws servers on the same machine they must be given different "id" in their respective config files. The yaws ctl scripts, such as yaws -s and friends now have an extra (optional) "-j id" flag to control which specific instance of Yaws is ment.

  • Added explicit support for Content-Length header from .yaws files for applications that require Content-Length instead of chunked encodings.

  • Changed the #sconf{} and #gconf{} records so that all the booleans in those 2 records are now a bitmask flag. This is a slightly backwards incompatible change and it affects those that use Yaws in embedded mode where the #sconf and #gconf records are explicitly manipulated. It sholdn't be a big deal to change though.

  • Workaround buggy otp error_logger_file_h which truncates the report file whenever it is reopened.

  • Removed the calls inside the server that were doing list_to_atom/1 We were suceptible to DOS attacks. This is unfortunately a backwards incompatible change since it affects the return value from API functions yaws_api:parse_query/1 and yaws_api:parse_post/1. They both used to return lists on the form of {Key, Val} tuples where Key was an atom. It is now a string. There is a configuration option for yaws.conf which keeps the old (broken) behaviour.

  • Optimized url parsing and removed at least one call to lists:flatten/1 in the fast path.

  • Better support for old Netscape and the Connection: Keep-Alive header.

  • More beautiful trace output. Try "yaws -i -x -T"

  • More and better debug support.

  • New install procedure with a more interesting yaws.conf template generated.

  • Updated the ssl test certs that come with yaws. The old ones had expired.

Feb 6, 2004 Version1.41 released

  • Bugfixes and feature release.

  • Minor bugfixes to the reverse proxy implementation (klacke)

  • SSI for the ehtml expander as well as for normal usage. (klacke)

  • Timestamp checks on SSI files (klacke)

  • Wiki fixes (Johan Bevemyr)

  • Return 404 instead of 403 when dir listings are disabled (Leon Smith)

  • Added CGI variable REQUEST_URI (cschultz)

  • Better dir listings with support for sort methods (Martin Bjorklund)

  • Redir, bugs (one would thing we'd be able to do correct redirs by now .. ehh) (Leon Smithh)

  • Support for 301,303, and 307 redirs (Johan Bevemyr)

  • php executable is configurable (cschultz)

  • Major feature enhancement, Support for a new concept called bindings, documented at http://yaws.hyber.org as well as in the man pages. (Joakim grebeno)

  • More redir cleanup as well as introduction of redirect_local, {any_path, URI}} and made yaws_cgi use it. (cschultz)

  • Made the webmail app able to render attachments (klacke)

Dec 18, 2003 Version 1.40 released

  • This is a major feature release.

  • Experimental reverse proxy implementation

  • New feature, server side includes inside ehtml structure with variable expansion

  • yaws_html an HTML parser which produce ehtml output. The ideal tool for all of us who flunked artclass in highscool. Makes it very easy to rip page design from other sites (designed by those who went to the art classes) )

  • A HTTP cookie parser

  • A full blown easy to configure web mail application. It keeps no state, thus only requires the IP of the pop3/smtp servers to run.

  • Some problems with ehtml expansion fixed

  • Major overhaul of the docs, written description of embedded mode yaws

  • Don't fail fatal when we can't bind()

  • Time zone fix

  • Mime type fix

  • tilde expansion and dir listings turned off by default, not on

  • Many small fixes to the wiki by and

Oct 4, 2003. Version 1.31 released

  • This is minor bugfix release

  • Even more redir bugs fixed by Johan Bevemyr

  • Runs on old erlangs (R7) (klacke)

  • Compiles and runs nicely under win32 cygwin using native win32 erlang (klacke)

  • Cosmetic fixes, docs update and return 403 on bad GETs by Leon Smith

Aug 25, 2003. Version 1.30 released

  • This is major feature release with many new features by in particular Carsten Schultz and Leon Smith plus the normal set of regular bugfixes.

  • Setuid code had broken (klacke)

  • Setcookie problem with lynx (Johan Bevemyr)

  • Wiki: Thumbnail index to slideshow (Johan Bevemyr)

  • Fixed Cross-Site Scripting vunerability (Leon Smith)

  • url parsing rewritten in order to normalize the URL path in a

  • more secure way (Leon Smith)

  • Log file size for dynamic content also (Carsten Schultz)

  • Full CGI and PHP support (Carsten Schultz)

  • Added support for Content-Range, If-Range, If-Match (Carsten Schultz)

  • HEAD handling rewritten (Carsten Schultz)

  • Darwin MacOs X support (Eric Baur)

  • Docs updated describing cgi and php support (Carsten Schultz)

  • tty trace directly from command line for enhanced debugging

Jun 1, 2003. Version 1.22 released

  • This is bugfix release.

  • cosmetic changes in ehtml output

  • wiki install problems

  • many fixes to the wiki

  • ssl config was broken

  • /etc/rc scripts for redhat/gentoo/suse linux

  • a redir bug fixed.

  • ebuild for gentoo added

  • slideshow support added to the wiki

  • cosmetic updates to the latex docs

Mar 6, 2003. Version 1.2 released

  • This is bugfix release.

  • log fixes by brucefitzsimons

  • cache bugs for URLs with a query part

  • erlang compiler bug workaround, The erlang compiler isn't reentrant !!!!!

  • Makefile cleanup my mikl

  • Bugs in listdir

May 3, 2003. Version 1.01 released

  • This is bugfix release.

  • Bug in ssl config passord parse found by Eric Pearson

  • Bug in arg rewrite handling found and fixed by Taavi Talvik

  • Bug with redir for missing trailing slash together with a query part of the url fixed, found by Erik Pearson

  • Added the option of disabling dir_listings

  • Added http version to access log messages

  • Did away with the idiotic calls to id -u as well as the the broken grep in /etc/passwd. Also ensured that .yaws files with a query part don't end up in the cache. They need to be reparsed every time

  • Fixed probles with paths that had a query part ending up in the cache

  • Added proper support for 'if-none-match' with etag matching by Johan Bevemyr

  • Skip empty space after an erl chunk in a .yaws file

  • Handle http_error which is generated by the inet_drv.c code. This assumes a patch to the inet_drv.c that actually generates a http_error in this case. Default erl hangs there. Here is the inet_drv.c diff

Jan 23, 2003. Version 1.0 released

  • This is major release. Yaws is now in production quality.

  • Some minor fixes to yaws_api.

  • security bug found by jcortner@cvol.net

  • can compile yaws file produced on win32, that is files with \r\n terminaded lines.

Dec 1, 2002. Version 0.60 released

  • This is minor maintenance release.

  • Support to run Yaws first as root, then under a a non privileged user

  • A bug in listdir together with ~username expansion fixed

  • Bugs in wraplog fixed

Nov 25, 2002. Version 0.59 released

  • Lots of fixes and new features in this release. This release of Yaws is fast, it delivers 3000 static/dynamic pages/sec on my 2Ghz home box.

  • Many fixes in the wiki,

  • ~username expansion now works

  • embedded mode is now fully implemented and functional

  • many new configuration directives

  • some backwards incompatible changes such as ssl config and yaws_api:parse_post_data/1. See the docs for details.

  • Arg rewrite, customized errors etc.

  • Lots of new documentation and new examples

  • Optimized ehtml generation

Oct 7, version 0.56 released.

  • Improved file editing if in the wiki

  • New returnvalue from out/1 break

  • The wiki returns w3c compliant code

  • New return value from out/1 {ehtml, ErlangTermStructure}

  • Multiple users by uid can now run yaws simultaneously.

  • Support for streamed large content from yaws code

  • Never cache yaws files that disn't compile properly.

  • Much more documentation, man page for yaws_api

  • added a cookie_session-server for persistent cookie sessions

  • full argument chunking support in Wiki

  • Install properly on FreeBSD.

  • Support for embedded mode (finally)

  • bugfix for empty POST

  • The shopingcart example is now fully implemented.

Sep 2, version 0.54 released.

  • Many fixes in the wikiweb by Johan Bevemyr, I'm now running a wikiweb at http://wiki.hyber.org

  • Support for HTTP Basic authentication by Sean Hinde

  • Better support for HTTP file upload by Johan and Sean

  • Support for many more MIME types by compiling a mime.types file by klacke

  • Support for OPTIONS http request by Johan Bevemyr

  • Lots of non ready code for a webmail app by klacke.

July 1, version 0.52 released.

  • It contains a complete wiki web written by Johan Bevemyr with original code

  • by Joe Armstrong. It also contains a series of minor and major bugfixes.

Jun 19, version 0.51 released. Lot's of fixes.

  • Return status 303 when browser asks for a dir URL without a trailing / in the http request. I've always wondered why apache does this. Now I know ... otherwise the relative URLs in /dir/index.html will be wrong when the browser tries to get them. Utilize this feature when listing dirs now, generate relative urls instead of absolute.

  • Removed the default_server_on_this_ip option, the first virthosted server in the config will be default if no Host: header is present

  • Made the Host: check to check for Host: host:port instead of just host when a server is run on a non-standard port. The browsers seem to set the Host: field to host:port

  • Tobbe added the -r flag to the startscript

  • Changed yaws_api:parse_post_data/1 so that it takes an arg struct as argument instead of querydata and added support for multipart form data in the process.

Jun 16, version 0.50 released.

  • A bug in setcookie fixed

  • a proper /etc/rc/init.d script written.

  • New flag, yaws -S which query status of the daemon. bug in cache reload fixed.

Jun 13, version 0.48 released.

  • It contains a complete rewrite of the API to generate dynamic content which makes it much easier to use.

  • Furthermore this version accumulates output into larger chunks which makes it much faster the earlier versions. We can now serve 2500 dynamically generated HTML pages per second on a 2GhZ machine.

  • A bug with iso 8859 chars in urls has been fixed.

  • Etag header for static content and Cache-Control header for dynamic.

  • Additional docs in the form of man pages.

Version 0.40 released.

  • Contains bugfixes and full SSL support as well as an embryo to WWW-Authenticate support.

Valid XHTML 1.0!