<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
	<title>CppCMS Blog :: Progress</title>
	<link>http://blog.cppcms.com/</link>
	<description>A blog on CppCMS - C++ Web Development Framework</description>
	<atom:link 
		href="http://blog.cppcms.com/rss/cat/1/" 
		rel="self" type="application/rss+xml" />
	

	
	<item>
		<title>CppCMS 2.0.1 Released</title>
		<link>http://blog.cppcms.com/post/129</link>
		<guid>http://blog.cppcms.com/post/129</guid>
		<description>
		&lt;div style=&quot;direction:ltr&quot;&gt;
		&lt;p&gt;Now modern C++ version of CppCMS is the stable and official one that should be used.&lt;/p&gt;

&lt;p&gt;Last version included few platform fixes: Android and Windows.&lt;/p&gt;
		
		&lt;/div&gt;
		</description>
	</item>
	
	<item>
		<title>Web Server Upgrade</title>
		<link>http://blog.cppcms.com/post/128</link>
		<guid>http://blog.cppcms.com/post/128</guid>
		<description>
		&lt;div style=&quot;direction:ltr&quot;&gt;
		&lt;p&gt;&lt;a href=&quot;http://cppcms.com&quot;&gt;http://cppcms.com&lt;/a&gt; and &lt;a href=&quot;http://blog.cppcms.com&quot;&gt;http://blog.cppcms.com&lt;/a&gt; were migrated to new ec2 Ubuntu 20.04 server. If you notice any issues update please.&lt;/p&gt;

&lt;p&gt;Known Issues: there are problems with wikipp table of content. I&#39;ll handle it later. &lt;strong&gt;Fixed&lt;/strong&gt;&lt;/p&gt;
		
		&lt;/div&gt;
		</description>
	</item>
	
	<item>
		<title>Next CppCMS Major Feature Poll</title>
		<link>http://blog.cppcms.com/post/126</link>
		<guid>http://blog.cppcms.com/post/126</guid>
		<description>
		&lt;div style=&quot;direction:ltr&quot;&gt;
		&lt;p&gt;I&#39;m looking into implementing next major feature that I can complete with reasonable effort. I have a list of following topics:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;HTTP/1.1 support - it would allow keep alive support and better
performance overall for multiple requests. It would allow future
implementation of web sockets.&lt;/li&gt;
&lt;li&gt;Multiple-Event-Loop support - today there is only 1 event loop for
the service and it can be a bottleneck for small requests on systems
with high core count.&lt;/li&gt;
&lt;li&gt;SSL support - for embedded systems that need proper web server.&lt;/li&gt;
&lt;li&gt;C++11 cleanup - replace all booster primitives that exist in C++11
with standard (&lt;code&gt;shared_ptr&lt;/code&gt;, &lt;code&gt;thread&lt;/code&gt;, &lt;code&gt;mutex&lt;/code&gt;, etc) provide move
constructors for many objects, replace &lt;code&gt;auto_ptr&lt;/code&gt; by &lt;code&gt;unique_ptr&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Feel free to suggest other ideas that you can think of that would be beneficial.&lt;/p&gt;

&lt;p&gt;Comment below or sent e-mail to cppcms-users mailing list.&lt;/p&gt;
		
		&lt;/div&gt;
		</description>
	</item>
	
	<item>
		<title>CppCMS 1.2.1 - security update was released today</title>
		<link>http://blog.cppcms.com/post/123</link>
		<guid>http://blog.cppcms.com/post/123</guid>
		<description>
		&lt;div style=&quot;direction:ltr&quot;&gt;
		&lt;p&gt;Security Bug Fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed security bug fix in JSON parser module that can lead to DOS&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Bugs Fixed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed issues #36 - building with GZIP disabled&lt;/li&gt;
&lt;li&gt;Fixed issue #150 - incorrect parsing of multipart form&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;By default CppCMS now uses OpenSSL instead of GNU-TLS if both available (you can change behavior back by adding &lt;code&gt;-DDISABLE_OPENSSL=ON&lt;/code&gt; to cmake)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Special Thanks to Khaled Yakdan from code-intelligence.de for reporting this security issue&lt;/strong&gt;&lt;/p&gt;
		
		&lt;/div&gt;
		</description>
	</item>
	
	<item>
		<title>CppCMS 1.1.1 Release Candidate 1 is Available </title>
		<link>http://blog.cppcms.com/post/120</link>
		<guid>http://blog.cppcms.com/post/120</guid>
		<description>
		&lt;div style=&quot;direction:ltr&quot;&gt;
		&lt;p&gt;New version includes following changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Nightly build system updated to moderns OSes/compilers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Windows XP -&gt; Windows 7&lt;/li&gt;
&lt;li&gt;MSVC 2008 x86 to MSVC 2017 x86/x65&lt;/li&gt;
&lt;li&gt;MinGW GCC 4.5 x86 -&gt; 7.1 x86/x64&lt;/li&gt;
&lt;li&gt;OpenSolars 2009 to Solaris 11&lt;/li&gt;
&lt;li&gt;FreeBSD 10 -&gt; FreeBSD 11.1&lt;/li&gt;
&lt;li&gt;Added travis.yml for Mac OS X builds&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improved http timeouts handling on non Linux/Windows OSes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Fixed incorrect asynchronous IO handing in &lt;code&gt;*cgi&lt;/code&gt; API.&lt;/li&gt;
&lt;li&gt;Added support of &lt;code&gt;SOL_SNDBUF/SOL_RCVBUF&lt;/code&gt; to service configuration&lt;/li&gt;
&lt;li&gt;Fixed HTTP timeout handling on Solaris&lt;/li&gt;
&lt;li&gt;Fixed #24 failure to send large blocks asynchronously over FastCGI&lt;/li&gt;
&lt;li&gt;Fixied issue #21 Program produces 100% CPU load on one core - due to incorrect EOF handling&lt;/li&gt;
&lt;li&gt;Fixed icu backend test for ICU &gt;= 60.1&lt;/li&gt;
&lt;li&gt;Fixed missing &lt;code&gt;getenv(std::string const &amp;amp;)&lt;/code&gt; issue #16&lt;/li&gt;
&lt;li&gt;Fixed issues with codecvt generation FreeBSD/clang&lt;/li&gt;
&lt;li&gt;Use Windows Vista/7 API by defaults since XP reached EOL.&lt;/li&gt;
&lt;li&gt;Fixed incorrect async connect error handling&lt;/li&gt;
&lt;li&gt;Lineup with Boost.Locale 1.65&lt;/li&gt;
&lt;li&gt;Updated session interface for external languages and unit tests&lt;/li&gt;
&lt;/ul&gt;

		
		&lt;/div&gt;
		</description>
	</item>
	
	<item>
		<title>CppCMS 1.1.0 Beta was released</title>
		<link>http://blog.cppcms.com/post/119</link>
		<guid>http://blog.cppcms.com/post/119</guid>
		<description>
		&lt;div style=&quot;direction:ltr&quot;&gt;
		&lt;p&gt;After the goals for 1.2 were completed I announce official CppCMS 1.1.0 beta (stable will be 1.2.0)&lt;/p&gt;

&lt;p&gt;It is available on the usual place:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://sourceforge.net/projects/cppcms/files/cppcms/1.1.0-beta/cppcms-1.1.0.tar.bz2&quot;&gt;https://sourceforge.net/projects/cppcms/files/cppcms/1.1.0-beta/cppcms-1.1.0.tar.bz2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It includes many new and important features:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://cppcms.com/wikipp/en/page/cppcms_1_2_whats_new&quot;&gt;http://cppcms.com/wikipp/en/page/cppcms_1_2_whats_new&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now I ask the community to fully participate in beta testing so 1.2 will be released ASAP.&lt;/p&gt;

&lt;h3&gt;Goals for beta testing&lt;/h3&gt;

&lt;h4&gt;Framework Unit Test:&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Download the beta version, build, run tests&lt;/li&gt;
&lt;li&gt;Report on what platform you tested: OS, Compiler version, standard library (libstdc++/libc++)&lt;/li&gt;
&lt;li&gt;Have you had any tests failed and if you had please attach Testing/Temporary/LastTest.log and CMakeCache.txt from your build directory&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;I specially need tests on Mac OS X various versions, various ARM platforms like raspberry pi and Windows different compilers&lt;/p&gt;

&lt;h4&gt;Compatibility Test:&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Try to build your existing applications with latest version, report any problems&lt;/li&gt;
&lt;li&gt;If you have been using CppCMS 1.0.5 till now please try to build CppCMS 1.1.0 and run existing programs with new shared objects/dll WITHOUT rebuilding your applications - it must work as is!&lt;/li&gt;
&lt;/ol&gt;


&lt;h4&gt;Feature Test:&lt;/h4&gt;

&lt;p&gt;Go to: &lt;a href=&quot;http://cppcms.com/wikipp/en/page/cppcms_1_2_whats_new&quot;&gt;http://cppcms.com/wikipp/en/page/cppcms_1_2_whats_new&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And try some of new features, report any issues with them or any problems with API design.&lt;/p&gt;

&lt;p&gt;If all goes smoothly I&#39;ll release 1.2.0 - official stable version.&lt;/p&gt;
		
		&lt;/div&gt;
		</description>
	</item>
	
	<item>
		<title>CppCMS code migrated to GitHub</title>
		<link>http://blog.cppcms.com/post/118</link>
		<guid>http://blog.cppcms.com/post/118</guid>
		<description>
		&lt;div style=&quot;direction:ltr&quot;&gt;
		&lt;p&gt;After multiple requests and my final decision the CppCMS web framework code migrated to GitHub&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/artyom-beilis/cppcms&quot;&gt;https://github.com/artyom-beilis/cppcms&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please note:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Only CppCMS framework migrated, other subprojects like CppDB or Wikipp are still pending conversion&lt;/li&gt;
&lt;li&gt;The main bug tracker is still on source-forge - however I&#39;ll relate to issues opened on GitHub&lt;/li&gt;
&lt;/ol&gt;

		
		&lt;/div&gt;
		</description>
	</item>
	
	<item>
		<title>Session Sharing with Non-CppCMS technologies</title>
		<link>http://blog.cppcms.com/post/117</link>
		<guid>http://blog.cppcms.com/post/117</guid>
		<description>
		&lt;div style=&quot;direction:ltr&quot;&gt;
		&lt;p&gt;One of the problems in integrating different technologies on same web site is sharing the data between them, in particular sharing session data.&lt;/p&gt;

&lt;p&gt;For example you have a huge web platform written in PHP or Java and you want to improve performance of certain subsystems poring them to CppCMS. On of the first issues you&#39;d encounter is how to share the session between them - so every side would know who is the user, what permissions he has, etc.&lt;/p&gt;

&lt;p&gt;So I made &lt;code&gt;cppcms::session_pool&lt;/code&gt; and &lt;code&gt;cppcms::session_interface&lt;/code&gt; accessible outside the usual request/response scope and wrapped it with &lt;a href=&quot;http://sourceforge.net/p/cppcms/code/HEAD/tree/framework/trunk/cppcms/capi/session.h&quot;&gt;pure C API&lt;/a&gt; - such that no C++ exceptions are thrown and every function is resolvable via &lt;code&gt;dlopen&lt;/code&gt;/&lt;code&gt;GetProcAddress&lt;/code&gt;- to make it more accessible for integration with different languages.&lt;/p&gt;

&lt;p&gt;Several modules for different programming languages were implemented allowing smooth integration with their web frameworks and APIs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP - using &lt;a href=&quot;http://swig.org&quot;&gt;Swig&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Java/Servlet - using &lt;a href=&quot;https://jna.java.net/javadoc/overview-summary.html&quot;&gt;JNA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python/Django - using &lt;a href=&quot;https://docs.python.org/2/library/ctypes.html&quot;&gt;ctypes&lt;/a&gt; (but not limited to Django)&lt;/li&gt;
&lt;li&gt;Asp.Net - using &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/aa288468%28v%3Dvs.71%29.aspx&quot;&gt;PInvoke&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Actually there is no particular limits regarding technology - just a question of implementing loadable module for a specific language/platform.&lt;/p&gt;

&lt;p&gt;In general it consists of a SessionPool object that is created from a configuration file and exists globally. It generates a special Session objects that is loaded from Http Request cookies, updated and saved to the Http Response object.&lt;/p&gt;

&lt;p&gt;It looks like this:&lt;/p&gt;

&lt;p&gt;PHP:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// pool initialization
$pool=CppCMS_SessionPool::from_config(&#39;cppcms-config.js&#39;);
// per request session access
$session=$pool-&amp;gt;session();
$session-&amp;gt;load();
$x=0;
if($session-&amp;gt;is_set(&#39;x&#39;)) {
        $x=$session[&#39;x&#39;];
}

$x=intval($x)+1;
$session[&#39;x&#39;]=$x;
$session-&amp;gt;save();
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Java/Servlet:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;static SessionPool pool;

public void init() throws ServletException
{
    pool = SessionPool.openFromConfig(&quot;/path/to/cppcms-config.js&quot;);
}

public void doGet(HttpServletRequest request,
                  HttpServletResponse response) 
                    throws ServletException, IOException
{
    Session session = pool.getSession();
    session.load(request);
    String x=&quot;0&quot;;
    if(session.isSet(&quot;x&quot;))
        x=session.get(&quot;x&quot;);
    x=Integer.toString(Integer.parseInt(x)+1);
    session.set(&quot;x&quot;,x);
    session.save(response);
    session.close();
    ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Python with Django:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Create global pool
pool=cppcms.SessionPool(&#39;/path/to/cppcms-config.js&#39;)

# Actual view
def home(request):
    s=pool.session()
    s.load(django_request=request)
    v=&#39;0&#39;
    if &#39;x&#39; in s:
            v= s[&#39;x&#39;]
    s[&#39;x&#39;]=str(int(v)+1)
    response = HttpResponse()
    s.save(django_response=response)
    ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;C#/ASP.Net:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;static SessionPool pool;
static Example() {
    pool = SessionPool.FromConfig(&quot;cppcms-config.js&quot;);
}
protected void Page_Load(object sender,EventArgs e)
{
    using(Session s = pool.Session()) {
        s.Load(Request);
        string v=&quot;0&quot;;
        if(s.IsSet(&quot;x&quot;))
            v=s[&quot;x&quot;];
        v = (int.Parse(v) + 1).ToString();
        s[&quot;x&quot;]=v;
        s.Save(Response);
    }
    ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So basically you have a full access to CppCMS session from 3rd party most popular technologies.&lt;/p&gt;

&lt;p&gt;Still thinking of implementing a module for Ruby on Rails but I have never written a line of code in Ruby so it is quite challenging for me. I&#39;ll probably wait till somebody contributes one.&lt;/p&gt;
		
		&lt;/div&gt;
		</description>
	</item>
	
	<item>
		<title>Serving All Israeli News Web Sites from a Single EC2 instance...</title>
		<link>http://blog.cppcms.com/post/114</link>
		<guid>http://blog.cppcms.com/post/114</guid>
		<description>
		&lt;div style=&quot;direction:ltr&quot;&gt;
		&lt;p&gt;For the last year the development of the CppCMS project was less active. The vast majority of the work hours were spent on a customer&#39;s project that used CppCMS to create an outstanding advertisement system.&lt;/p&gt;

&lt;p&gt;The project is called &lt;a href=&quot;http://linicom.co.il&quot;&gt;Linicom&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Today, when Linicom is up, running and maintained by a larger team, so I can resume the activity on the core CppCMS project itself.&lt;/p&gt;

&lt;p&gt;Few words about Linicom:&lt;/p&gt;

&lt;p&gt;Linicom is an engine that provides content and visitor sensitive advertisements for almost all large Israeli news web sites: including Ynet, Haaretz, Jerusalem Post, Mako, Walla and other significant web sites in Israel and abroad.&lt;/p&gt;

&lt;p&gt;Here some interesting facts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linicom is based on CppCMS technology.&lt;/li&gt;
&lt;li&gt;The system serves around 10,000,000 &lt;em&gt;custom&lt;/em&gt; requests a day, i.e ~115 req./s.&lt;/li&gt;
&lt;li&gt;During peak hours, it servers around 160 requests per second.&lt;/li&gt;
&lt;li&gt;Its typical network output is around 11 megabit per second.&lt;/li&gt;
&lt;li&gt;Its total memory consumption (web server, database, applications, OS) is only around 350Mb.&lt;/li&gt;
&lt;li&gt;The server&#39;s average CPU load is around 5%&lt;/li&gt;
&lt;li&gt;The server runs on a &lt;code&gt;c1.medium&lt;/code&gt; Amazon EC2 instance.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The system runs behind Lighttpd and uses PostgreSQL for persistent data storage. Also PostgreSQL is used extensively, all real time data is stored in memory.&lt;/p&gt;

&lt;p&gt;Almost every request needs data processing in order to provide highly customized advertisements. In technical terms it means that almost no request can be &quot;outsourced&quot; to a static files - every request for every customer should be processed explicitly.&lt;/p&gt;

&lt;p&gt;This system is probably one of the classic applications of CppCMS technology - web based system that required to be fast and efficient, being able to handle outstanding and sometimes unexpectedly changing loads without problems and provide high QoS.&lt;/p&gt;

&lt;p&gt;Use of in-memory data storage, caching and efficient handing of the data that can&#39;t be cached is were CppCMS shines. Having a big growth potential with a minimal required maintenance and high reliability allows the to handle the business-end safely without worrying about performance issues.&lt;/p&gt;
		
		&lt;/div&gt;
		</description>
	</item>
	
	<item>
		<title>CppCMS 1.0.5 Released</title>
		<link>http://blog.cppcms.com/post/116</link>
		<guid>http://blog.cppcms.com/post/116</guid>
		<description>
		&lt;div style=&quot;direction:ltr&quot;&gt;
		&lt;p&gt;Bug Fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed 121, 98 - bug caused invalid year formatting/parsing by icu backend - fixed incorrect use of year of the week instead year&lt;/li&gt;
&lt;li&gt;Fixed 122 - memory leak in Win32 threading library&lt;/li&gt;
&lt;li&gt;Fixed 105 - string_key.h has a bad operator &#39;!=&#39;&lt;/li&gt;
&lt;li&gt;Fixed 119 - bad html formatting.&lt;/li&gt;
&lt;li&gt;Fixed 106 - IPv6 support on Winows&lt;/li&gt;
&lt;li&gt;Fixed 129 - cppcms_make_key - invalid option name&lt;/li&gt;
&lt;li&gt;Fixed 97 - impossible to use upper case in namespace in &lt;code&gt;&amp;lt;% include %&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Fixed 84 - 64K fd limit&lt;/li&gt;
&lt;li&gt;Fixed 108 - test_locale_boundary &amp;amp; booster_locale_formatting failure&lt;/li&gt;
&lt;li&gt;Fixed various issues libc++/clang support&lt;/li&gt;
&lt;li&gt;Significantly improved multipart parsing closing f.r. 27&lt;/li&gt;
&lt;li&gt;Removed reuse_address socket option use at Windows&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Minor Security Improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Issue 117: possibility of Timing Attack Vulnerability&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Platform Support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NetBSD is supported platform&lt;/li&gt;
&lt;li&gt;FreeBSD added support of POSIX locale &amp;amp; clang/libc++&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The code is downloadable from sourceforge. Binary RPM releases already available at The Open Build Service repository. Debian packages would be published soon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Debian and Ubuntu packages are ready at the repository.&lt;/p&gt;
		
		&lt;/div&gt;
		</description>
	</item>
	


</channel>
</rss>
