Fri Jan 2 16:28:00 1998 Nanbor Wang * clients/Caching/http_handler.cpp: * clients/Blobby/Blob.cpp: Added missing explicit template instantiations. Mon Dec 29 20:20:36 1997 James C Hu * clients/Caching/http_handler.cpp: Idem to previous change. Mon Dec 29 18:50:02 1997 James C Hu * server/IO.cpp: Idem to previous change, but fixes to improve compatibility and portability to Windows NT. Thu Dec 18 15:37:36 1997 James C Hu * server/IO.cpp: Modified to account for changes in ACE_Filecache to not map file on NT. Tue Dec 16 09:29:11 1997 David L. Levine * server/Makefile: expanded rules.bin.GNU, but without $(VOBJS), to avoid make warnings. * client/WebSTONE/src/nsapi-includes/base/systems.h: #ifdef linux, not LINUX. Fri Dec 12 03:06:16 1997 James C Hu * server/Parse_Headers.cpp: Many things have been touched, but only a few things have significantly changed. I originally attempted to change the implementation entirely to use Hash_Map_Manager instead, but it was getting more complicated than I wanted, so I went back to debugging. - Trailing whitespace has been removed. - A couple of debug messages have been added the Headers::parse_header_line (). - Method declarations had to be changed to account for the fact that the Map_Item class (which had previously been declared inside of Headers_Map) is now in global scope and has been renamed to Headers_Map_Item. - The no_value_ data member and the char* cast operator of Map_Item have been removed. - The assignment operator for Map_Item has been made a bit tidier in its memory management (say no to memory leaks!). - Debugged the Headers_Map data structure. This involved the following: . Re-implementation of strcasecmp (red-herring). . Re-implementation of Headers::compare (). This is needed because empty table entries need to compare as infinity against real strings, so that real strings get inserted correctly. . Debugging the Headers_Map::find () method by implementing first a linear search, and then my own binary search. It turns out the C library ::bsearch() does work, but I will leave in my implementation for now, since ::bsearch () is not in ACE_OS yet. . Re-implementation of Headers::place (). The old one was badly written. The new one is more efficient, and less error prone. This method turned out to be the main problem. It was the reason that binary search was previously failing (but linear search worked). The reason? It was corrupting memory, believe it or not. No longer! In addition, Headers::place () had a serious bug in which a call to ACE_OS::free () was added, but included the ++ operator on the pointer from the previous line. Ug. * server/Parse_Headers.h: See comments for HTTP_Request.cpp. * server/HTTP_Request.cpp: Removed extraneous whitespace. It's not what you think Doug! Just trailing whitespace at the end of lines that somehow get added on when people use LoseNT editors. Also, changes were made to Parse_Headers which made it necessary to explicitly use the value () accessor method when examining parsed headers. There use to be a operator char* () method. * server/HTTP_Response.cpp: See comments for HTTP_Request.cpp. * server/HTTP_Helpers.cpp: Added a comment to HTTP_Helper::fixyear (). Tue Dec 9 01:19:09 1997 James C Hu * stress_testing/util.cpp: Off by one errors when parsing a URL. Did I write this code? I don't think so. Thanks to Valik Solorzano Barboza for pointing this out. Thu Nov 20 00:36:34 1997 James C Hu * server/Pipeline.h: Added methods and members so that the pipeline can be both push and pull driven. * server/Pipeline.cpp: Made the pipeline a doubly linked list of components, so that it can be operated as push-driven or pull-driven pipelines. Wed Nov 19 05:10:38 1997 Douglas C. Schmidt * server/HTTP_Handler.h: Added the keyword "virtual" on the open() method which is inherited from ACE_Sevice_Handler. Perhaps this will fix a bug with BORLANDC reported by Valik Solorzano Barboza . Mon Nov 17 07:34:09 1997 Douglas C. Schmidt * server/Parse_Headers.cpp (end_of_line): Replaced a const char * with a char * to work with the new ACE_OS::strchr() signature. Thanks to James for finding this. Tue Nov 11 19:52:38 1997 James C Hu * server/Pipeline.{h,cpp}: The beginning of a new Pipeline framework has been added. Sun Oct 12 16:21:32 1997 Carlos O'Ryan * clients/Caching/Makefile: * stress_testing/Makefile: There is no need to set LDLIBS to add local object files anymore, using FILES is enough. Fri Oct 10 18:41:47 1997 Carlos O'Ryan * clients/Blobby/Makefile: Fixed problem that made compilation fail. Thu Sep 11 10:40:38 1997 Carlos O'Ryan * server/HTTP_Request.cpp: I checked the use of MAXNAMELEN vs. MAXPATHLEN; all buffers intended to keep full filenames should have at least MAXPATHLEN+1 chars. Only buffers that will keep basenames (without any directories) should have MAXNAMELEN+1 bytes. I also added a new macro ACE_MAX_FULLY_QUALIFIED_NAME_LEN which is the maximum number of characters for a fully qualified internet hostname. There remain one obscure usage of these macros in ace/Malloc.h and Local_Naming_Space_T.{h,cpp}, but a quick fix broke something, I will try again soon. Tue Sep 9 22:08:36 1997 James C Hu * server/HTTP_Server.{cpp,h}: Changes which answer questions brought up in design review. Mostly additional comments. Also changes to have a task spawn a number of threads rather than iterating through calls to the activate method. Fri Aug 29 11:07:43 1997 James C Hu * server/*.{cpp,h}: Changes to make JAWS comply with ACE coding standards. In particular, broke up CGI method in HTTP_Request, remove dependency on static object in HTTP_Config, and answered all questions from Doug. Tue Aug 26 21:34:11 1997 Douglas C. Schmidt * clients/Caching/ID_Generator.h: Made some minor changes to the programming style. Sun Aug 10 13:44:14 1997 Douglas C. Schmidt * server/HTTP_Helpers.cpp (HTTP_date): We can't use ACE_Thread_Mutex directly in the code since that breaks platforms that lack threads. Wed Aug 6 16:45:48 1997 James C Hu * server/main.cpp: Added another signal handler so I can kill JAWS when purifying. Mon Aug 4 00:07:24 1997 Nanbor Wang * server/main.cpp (main): Service configurator now doesn't return -1 when errors occur. Therefore, we check for not success instread of fail when opening the service contifurator. Mon Jul 28 04:54:01 1997 Douglas C. Schmidt * server/Parse_Headers.cpp (place): Reformatted the same stuff again... Mon Jul 28 01:48:40 1997 James C Hu * server/README: Updated the README file to reflect new features and server flags. * server/Parse_Headers.cpp (place): Fixed a compile error found by David Levine. I don't know why this was compiling for me. Sun Jul 27 21:56:12 1997 Douglas C. Schmidt * server/Parse_Headers.cpp (place): Reformatted a few things to make them easier to read. Fri Jul 25 02:05:20 1997 James C Hu * server/HTTP_Server.cpp: Changes to allow the thread creation flags to be specified from the command line. Removed some code that was used to track down memory leaks. * server/HTTP_Helpers.{h,cpp}: Added another method HTTP_date (char *), so that a buffer to which the date will be written to can be passed into the HTTP_date routine. * server/HTTP_Response.cpp: Changed some code so that the baseline implementation can be created at compile time. * server/IO.cpp: Changed some code so that the baseline implementation can be created at compile time. * server/main.cpp: Changed the signal handler to wait for threads to die. However, this code will remain dormant for now, until we design a nice way to shut down a thread pool. * server/svc.conf: Changes to add some other entries people can try. * server/Makefile: Changes to allow JAWS to be built with static linking only, to ease the process of using Purify and Quantify. Dynamic linking will be re-configured in the future when we have all the memory leaks worked out. Mon Jul 22 16:55:00 1997 Chris Cleeland * Changed references to WRAPPER_ROOT to ACE_ROOT in every place except ChangeLog entries. Mon Jul 21 15:09:03 1997 James C Hu * server/HTTP_Server.{h,cpp}: Got rid of Solaris specific debugging code (thr_create, thr_join). Fri Jul 11 02:15:12 1997 James C Hu * server/HTTP_Response.cpp: Changes so that the HEADER is not rebuilt all the time. * server/IO.cpp (JAWS_Synch_IO::transmit_file): Changed to use writev () instead of multiple send ()s. Thu Jul 10 01:53:48 1997 James C Hu * server/HTTP_Helpers.{h,cpp}: Changed so that creating the date header is less expensive. * server/HTTP_Response.cpp: Changes to match above. * clients/Caching/README: Added to the repository. * clients/Caching/http_handler.{h,cpp}: Added some comments to the code. Also, moved the code to check to see if the file is in cache already into the connector, so that a connect is not done if the file is cached. This required a filename () accessor method to be added to the handler. Wed Jul 9 13:08:00 1997 James C Hu * clients/Caching/http_handler.cpp (svc): Added code to check to see if the file is already cached before trying to cache it. * clients/Caching/http_client.cpp (main): Added a comment block at the top of the file. * server/HTTP_Handler.cpp and IO.cpp: Changes that were needed since JAWS_File is now integrated into ACE (as ACE_Filecache). * server/HTTP_Server.*: Attempting to track down memory leak. This code may be in a state a flux for the next week or so. Mon Jul 7 23:40:13 1997 Nanbor Wang * clients/WebSTONE/src/webclient.c: Removed a bunch of THREAD storage class decorators from function makeload() because auto variables can't be declared as TSS. Also #ifdef random number generation code so it uses rand_r on Solaris() and rand() on NT. * clients/WebSTONE/src/rexec.c: Modified prototypes for PassOutputThread() and PassErrorThread() to avoid warnings from MSVC. Still need more refinement on this one. ;( * clients/WebSTONE/src/webmaster.c: Added prototype for HostEntCpy() and a null statement to avoid warning from MSVC. * clients/WebSTONE/src/gendata/genrand.mak: * clients/WebSTONE/src/master/webmaster.mak: * clients/WebSTONE/src/client/webclient.mak: Updated file paths and dependencies. Sat Jul 5 14:19:20 1997 Douglas C. Schmidt * Renamed the client directory "clients" to reflect the fact that we've got multiple client tests now. Also, moved the original contents of the client directory into a new clients/Blobby directory and added Caching and WebSTONE. * Moved the ChangeLog from the ./server directory into the ./JAWS directory since we want to apply ChangeLog entries to all aspects of JAWS, not just the server. * HTTP_Server.cpp (open): Added THR_DETACHED as a flag to activate(). This should prevent a memory leak that was occurring since no thread was ever "joining" the threads that were spawned. Thu Jul 3 23:33:47 1997 James C Hu * HTTP_Response.cpp (~HTTP_Response): changed delete to delete [], removing a major memory leak from JAWS. Still to find is a memory lead associated with thread per request. Nanbor's fix is about what I did to EMPTY_HEADER too. * JAWS_File.cpp: David points out I need to add specializations for the GNU C++ compiler. Thu Jul 3 22:38:04 1997 Nanbor Wang * HTTP_Response.cpp (build_headers): Added explicit cast for EMPTY_HEADER from (const char *) to (char *) in order to make MSVC happy. This is probably very badly styled. But HTTP_HEADER is only used in places that require (const char *), so I think it's safe to do so. Thu Jul 3 15:34:30 1997 James C Hu * HTTP_Response.cpp (HTTP_Response): Moved a call to delete out of constructor into the destructor where it belongs. Thu Jul 3 12:28:44 1997 Sumedh Mungee * Parse_Headers.cpp: Line 137, Changed pt to ptr (it was a typo) Wed Jul 2 22:33:52 1997 James C Hu * JAWS_File.{h,cpp}: Fixed deadlock bug, since RW_MUTEX's are not recursive (drat!). Wed Jul 2 21:03:12 1997 Douglas C. Schmidt * Made a major pass through all the code and made the style consistent with that found in ACE. Wed Jul 2 14:33:27 1997 James C Hu * JAWS_File.cpp: Added double check locking pattern to the fetch routine of the virtual filesystem. This slows things down considerably for files which change frequently and for cache misses in general, but it should be correct. Wed Jul 2 14:59:29 1997 Nanbor Wang * HTTP_Helpers.cpp (HTTP_decode_string): Added cast from strtol to char explicitly to prevent NT from complaining. Wed Jul 2 14:33:27 1997 James C Hu * JAWS_File.{h.cpp}: Modifications to support RW_MUTEX for both the virtual filesystem and the low level ACE_File. Next major change will be to re-implement the virtual filesystem to use a hash table ala ACE_Hash_Map_Manager. Wed Jul 2 00:23:22 1997 James C Hu * HTTP_Server.{h,cpp}: Changed parsing of options to use mnemonic names rather than numbers. Added a new thread strategy, THROTTLE. This is thread-per-request until some maximum number. Unfortunately, it does not become thread-pool at this point... yet :-). Added a new option to pass in a backlog value. * svc.conf: adjusted to account for the changed options. * README: changed to explain new svc.conf options. * JAWS_File.cpp: Changed it so that when the file is added to the cache, it is also acquired. When it is removed from the cache, it is released. This is so that the reference count is at least one while the file is in the cache. Also, fixed the virtual filesystem by giving it a simple replacement strategy if the table is full. For now, it will replace the largest file in the cache with the request for the current file. Tue Jul 1 19:13:44 1997 Nanbor Wang * JAWS_File.cpp (JAWS_File): Changes the creation method of a cached copy from using plain file copy to using mmap and memcpy. This avoid the extra complexity caused by FILE_FLAG_OVERLAPPED. Sat Jun 28 11:55:38 1997 James C Hu * HTTP_Handler.cpp (open): fixed a typo * HTTP_Handler.cpp (cgi): fixed a bug, strdup fails on NULL Sat Jun 28 16:14:38 1997 Sumedh Mungee * HTTP_Handler.cpp (open): Changed socket send-buffer to 64k Wed Jun 25 01:11:50 1997 Nanbor Wang * JAWS_File.cpp: Removed initialization of vfs_ (see below) and changed all references of vfs_ to JAWS_Virtual_Filesystem::instance (). Thanks to Detlef Becker for pointing this out. (init): Added initialization of reference_count_ to 0. * JAWS_File.h: Removed private member JAWS_Virtual_Filesystem vfs_ since JAWS_Virtual_Filesystem is a singleton already. Caching it doesn't seem to win much and depends on the order of static variables initialization, which is non-portable. Fri Jun 13 02:42:39 1997 Nanbor Wang * jaws.{mdp,mak}: Updated to incoporate latest changes. Thu Jun 5 14:13:22 1997 James C Hu * HTTP_Server.cpp: Added more informative comments to the asynch_thread_pool() method due to comments posed by Mehul (MehulM@spa-marketing.com). Wed Jun 4 23:00:47 1997 James C Hu * JAWS_File.cpp (JAWS_File): Fixed a bug where JAWS_File wanted the file to have write permissions before openning it. This is now only true if the file is to be written to. Wed Jun 4 22:30:41 1997 Nanbor Wang * main.cpp (main): Changed SIGCLD to SIGCHLD for better portability. * IO.cpp (transmit_file): The third argument passed ACE_Asynch_Transmit_File::Header_And_Trailer() should be an address (&). Mon Jun 2 16:35:18 1997 James C Hu * HTTP_Helpers.cpp: Serious bug in base64 decoder routine squashed. Didn't initialize an array with 0's. The original source had them declared static. Also, changed sizeof alphabet_ to strlen (alphabet_), because original code had alphabet_ as an array, but my translation has alphabet_ as a pointer. * HTTP_Response.cpp: Added some code to check to see if the decoder returns 0. If it does, flag this as a failed authorization attempt. * HTTP_Handler.cpp: Added a "\r\n" to the confirmation message in receive_file_complete () method. * HTTP_Request.cpp: In parse_request_line (), created conditional expressions in the debugging print statement so that a null string will not cause the server to crash. * HTTP_Response.cpp: (1) cgi_resposnse () no longer has to wait for the process to die. The fix to ACE_Process of closing down child handles was enough to get the connection to die on its own. (2) Mike (mrm@cisco.com) pointed out that the output for CGI responses was not create. The fix was to output a small header before execing the CGI program. * test.cgi: a sample cgi program to use when testing the JAWS server. Sat May 31 13:34:14 1997 James C Hu * *.h, *.cpp: Changed include lines from "apps/JAWS/server/..." to "..." to avoid dependencies on the WRAPPER_ROOT tree. * jaws.auth: This file is added to be a sample authorization file. This is the file which JAWS is currently hardcoded to use to verify authenticated PUT requests. * HTTP_Response.cpp: Added code to normal_response () and to error_response () to better handle authentication. Now, all PUT methods are required to be authenticated. The strategy now is very simple, there is only one authorization file and only one realm of authorization. This will be easy to bring up to spec later, though. * HTTP_Helpers.h: Added alphabet_ data member for the decode/encode base64 methods. * HTTP_Helpers.cpp: Added HTTP_decode_base64 and HTTP_encode_base64 methods. HTTP_encode_base64 is currently not used, but HTTP_decode_base64 is being used for Basic authentication. * *.h, *.cpp: Changed include lines from "JAWS/server/..." to "apps/JAWS/server/..." to fix an error reported by Rob Payne . This was really due to a bug in the platform_macros.GNU file not adding INCLDIRS to the CCFLAGS during compilation, but in the case other platforms have the same problem, changing the source is a better fix. Fri May 30 23:19:03 1997 James C Hu * README: updated to better reflect the status of JAWS. * main.cpp (handler): Added a signal handler for SIGINT, and also set SIG_IGN for SIGCLD. The first handler calls exit (0) if SIGINT is received, so that static destructors are called. The second is so that zombies are not formed. * HTTP_Response.cpp (cgi_response): Debugging. (1) The CGI program spewed output on the server side instead of the client. (2) The CGI program had environment variable being set even though there was no associated value. (3) The client connection was not being closed after the CGI program executed. Problem (1) was fixed by using set_handles () in cgi_options. Problem (2) was fixed by testing to see if the header had an associated value before assigning it to the environment. Problem (3) was fixed by sending an empty confirmation message after waiting for the CGI process to exit. * HTTP_Request.cpp (cgi): Debugging. It was not looking for a ".cgi" extension during the stage of determining if a URI is a CGI script. This will later be fixed when a full mime-type facility is implemented. Fri May 23 00:45:24 1997 James C Hu * JAWS/server: Debugged HTTP/0.9 GET requests, and HTTP/1.0 PUT requests. Both work now, with minor problems: e.g. the Content-type header doesn't really work (always sends text/html as the content type). What it should do is see if the request included a content type header, and use it, otherwise, resort to some file suffix and mimetype matching algorithm. * Parse_Headers.h (complete_header_line): Added comments explaining the new return values of -1, 0 and 1 (see comments for Parse_Headers.cpp below). * Parse_Headers.cpp (complete_header_line): modified so that it returns three values instead of two. -1 means that an end of line was encountered, but nothing after it yet to verify if it is really a complete header line. 0 means the read cut off in the middle of a line (no end of line character found). 1 means the line is verified to be a complete header line. * HTTP_Request.cpp (parse_request): Changed the test so that an HTTP/0.9 request would be sent immediately after being issued. This involved changes to Parse_Headers. * JAWS_File.cpp (acquire): Changes involved adding some debugging statements to understand why PUT was not working. Discovered a bug in how ACE_Mem_Map was being used. * HTTP_Request.cpp (content_length): Changed to extract value from the headers, if available. Thu May 22 16:22:03 1997 James C. Hu * HTTP_Request.cpp (cgi_env): Added a cast so that a warning generated by SGI C++ compiler goes away. * Makefile: Reordered the way the files are compiled/linked so that useless warnings about object files not resolving any symbols go away. Wed May 21 15:33:33 1997 James C Hu * JAWS_File.{h,cpp}: Added some comments. Will add a copy () method soon, after I move my workspace over to lambada. * JAWS_Tilde.{h,cpp}: This class is being implemented but has not been added to the repository yet, since JAWS as yet does not use it, and it is still being developed. This will be a cache of the expansions from ~foo to the home directory of foo. Tue May 20 22:49:24 1997 James C Hu * JAWS_File.{h,cpp}: New class created to replace the old kludgy VFS thingy. This new cached virtual filesystem is way cool: a file which is being retrieved can be simultaneously replaced without causing either reader or writer to wait. Reference counts are maintained now, which was missing in VFS. Also, there is no longer a dependency on the JXH_List template now, which is a plus. * IO.cpp: Changes to adapt to the new virtual filesystem. The changes all involved simplifications to the programming interface. * HTTP_Handler.cpp: Changes required to deal with the more generic error responses returned from the JAWS_File/JAWS_IO interface. This generality will make it easier to adapt JAWS_File and JAWS_IO into ACE. * test_JAWS_File.cpp: A test program written to see if the new virtual filesystem works the way I expect it to.