summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorjxh <jxh@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1998-10-06 08:03:45 +0000
committerjxh <jxh@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1998-10-06 08:03:45 +0000
commitc99f1b087ee6b6afea8f436a197abb2e29785715 (patch)
treef1d49e9e3edda3e33a3707147fef33976cf79e1e /apps
parentc82fae60dac5588dccd6f1c59f738503add5a82b (diff)
downloadATCD-c99f1b087ee6b6afea8f436a197abb2e29785715.tar.gz
Moving towards a full HTTP server again.
Diffstat (limited to 'apps')
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/Makefile419
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/http_base.cpp319
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/http_base.h88
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/http_headers.cpp137
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/http_headers.h169
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/http_request.cpp82
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/http_request.h47
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/http_response.cpp45
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/http_response.h37
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/http_status.cpp78
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/http_status.h96
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/parse_http_request.cpp112
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/parse_http_request.h47
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/parse_http_response.cpp69
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/parse_http_response.h43
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/parse_url.cpp316
-rw-r--r--apps/JAWS/PROTOTYPE/HTTPU/parse_url.h61
-rw-r--r--apps/JAWS/PROTOTYPE/HTTP_10.cpp45
-rw-r--r--apps/JAWS/PROTOTYPE/HTTP_10.h145
-rw-r--r--apps/JAWS/PROTOTYPE/HTTP_10_Parse.cpp295
-rw-r--r--apps/JAWS/PROTOTYPE/HTTP_10_Read.cpp9
-rw-r--r--apps/JAWS/PROTOTYPE/HTTP_10_Request.cpp274
-rw-r--r--apps/JAWS/PROTOTYPE/HTTP_10_Write.cpp88
-rw-r--r--apps/JAWS/PROTOTYPE/JAWS/Headers.cpp165
-rw-r--r--apps/JAWS/PROTOTYPE/JAWS/Headers.h73
-rw-r--r--apps/JAWS/PROTOTYPE/JAWS/IO.cpp2
-rw-r--r--apps/JAWS/PROTOTYPE/JAWS/IO_Handler.cpp22
-rw-r--r--apps/JAWS/PROTOTYPE/JAWS/Makefile2
-rw-r--r--apps/JAWS/PROTOTYPE/JAWS/Parse_Headers.cpp418
-rw-r--r--apps/JAWS/PROTOTYPE/JAWS/Parse_Headers.h116
-rw-r--r--apps/JAWS/PROTOTYPE/Makefile366
31 files changed, 3187 insertions, 998 deletions
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/Makefile b/apps/JAWS/PROTOTYPE/HTTPU/Makefile
new file mode 100644
index 00000000000..e304d0cc41f
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/Makefile
@@ -0,0 +1,419 @@
+#----------------------------------------------------------------------------
+# $Id$
+#
+# Makefile for the ACE Adapter Web Server (JAWS) client
+#----------------------------------------------------------------------------
+
+#----------------------------------------------------------------------------
+# Local macros
+#----------------------------------------------------------------------------
+
+#BIN = test_parse_url test_parse_http_request test_http_headers \
+# test_http_request test_http_response
+
+SHLIB = libHTTPU.so
+FILES = parse_url parse_http_request parse_http_response \
+ http_request http_response http_base http_status \
+ http_headers
+
+LSRC = $(addsuffix .cpp,$(FILES))
+LOBJ = $(addsuffix .o,$(FILES))
+
+CPPFLAGS += -I..
+
+LDLIBS = -lhttpu -laoutil
+BUILD = $(VSHLIB) $(SHLIBA) $(VLIB)
+
+
+#----------------------------------------------------------------------------
+# Include macros and targets
+#----------------------------------------------------------------------------
+
+include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU
+include $(ACE_ROOT)/include/makeinclude/macros.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.common.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.nonested.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.lib.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.bin.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
+
+#----------------------------------------------------------------------------
+# Local targets
+#----------------------------------------------------------------------------
+
+#----------------------------------------------------------------------------
+# Dependencies
+#----------------------------------------------------------------------------
+# DO NOT DELETE THIS LINE -- g++dep uses it.
+# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
+
+.obj/parse_url.o .obj/parse_url.so .shobj/parse_url.o .shobj/parse_url.so: parse_url.cpp $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/inc_user_config.h \
+ $(ACE_ROOT)/ace/config.h \
+ $(ACE_ROOT)/ace/config-sunos5.5.h \
+ $(ACE_ROOT)/ace/config-g++-common.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/OS.i $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/ACE.h $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i ../HTTPU/parse_url.h
+.obj/parse_http_request.o .obj/parse_http_request.so .shobj/parse_http_request.o .shobj/parse_http_request.so: parse_http_request.cpp \
+ ../HTTPU/parse_http_request.h $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/inc_user_config.h \
+ $(ACE_ROOT)/ace/config.h \
+ $(ACE_ROOT)/ace/config-sunos5.5.h \
+ $(ACE_ROOT)/ace/config-g++-common.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/OS.i $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/ACE.h $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i ../HTTPU/http_headers.h \
+ $(ACE_ROOT)/ace/RB_Tree.h \
+ $(ACE_ROOT)/ace/RB_Tree.i \
+ $(ACE_ROOT)/ace/RB_Tree.cpp \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
+ $(ACE_ROOT)/ace/Synch.i $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp ../JAWS/Parse_Headers.h \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(ACE_ROOT)/ace/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Message_Block.i ../JAWS/Headers.h
+.obj/parse_http_response.o .obj/parse_http_response.so .shobj/parse_http_response.o .shobj/parse_http_response.so: parse_http_response.cpp \
+ ../HTTPU/parse_http_response.h $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/inc_user_config.h \
+ $(ACE_ROOT)/ace/config.h \
+ $(ACE_ROOT)/ace/config-sunos5.5.h \
+ $(ACE_ROOT)/ace/config-g++-common.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/OS.i $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/ACE.h $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i
+.obj/http_request.o .obj/http_request.so .shobj/http_request.o .shobj/http_request.so: http_request.cpp ../HTTPU/http_request.h \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/ACE.h $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/inc_user_config.h \
+ $(ACE_ROOT)/ace/config.h \
+ $(ACE_ROOT)/ace/config-sunos5.5.h \
+ $(ACE_ROOT)/ace/config-g++-common.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/OS.i $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
+ $(ACE_ROOT)/ace/Synch.i $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(ACE_ROOT)/ace/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Message_Block.i ../JAWS/Parse_Headers.h \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp ../JAWS/Headers.h \
+ ../HTTPU/http_base.h ../HTTPU/http_status.h ../HTTPU/http_headers.h \
+ $(ACE_ROOT)/ace/RB_Tree.h \
+ $(ACE_ROOT)/ace/RB_Tree.i \
+ $(ACE_ROOT)/ace/RB_Tree.cpp ../HTTPU/parse_http_request.h \
+ ../HTTPU/parse_url.h
+.obj/http_response.o .obj/http_response.so .shobj/http_response.o .shobj/http_response.so: http_response.cpp ../HTTPU/http_response.h \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/ACE.h $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/inc_user_config.h \
+ $(ACE_ROOT)/ace/config.h \
+ $(ACE_ROOT)/ace/config-sunos5.5.h \
+ $(ACE_ROOT)/ace/config-g++-common.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/OS.i $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
+ $(ACE_ROOT)/ace/Synch.i $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(ACE_ROOT)/ace/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Message_Block.i ../JAWS/Parse_Headers.h \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp ../JAWS/Headers.h \
+ ../HTTPU/http_base.h ../HTTPU/http_status.h ../HTTPU/http_headers.h \
+ $(ACE_ROOT)/ace/RB_Tree.h \
+ $(ACE_ROOT)/ace/RB_Tree.i \
+ $(ACE_ROOT)/ace/RB_Tree.cpp ../HTTPU/parse_http_response.h
+.obj/http_base.o .obj/http_base.so .shobj/http_base.o .shobj/http_base.so: http_base.cpp ../JAWS/Parse_Headers.h \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Synch.h $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/inc_user_config.h \
+ $(ACE_ROOT)/ace/config.h \
+ $(ACE_ROOT)/ace/config-sunos5.5.h \
+ $(ACE_ROOT)/ace/config-g++-common.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/OS.i $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
+ $(ACE_ROOT)/ace/Synch.i $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(ACE_ROOT)/ace/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Message_Block.i ../JAWS/Headers.h \
+ ../HTTPU/http_base.h ../HTTPU/http_status.h ../HTTPU/http_headers.h \
+ $(ACE_ROOT)/ace/RB_Tree.h \
+ $(ACE_ROOT)/ace/RB_Tree.i \
+ $(ACE_ROOT)/ace/RB_Tree.cpp
+.obj/http_status.o .obj/http_status.so .shobj/http_status.o .shobj/http_status.so: http_status.cpp ../HTTPU/http_status.h \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Synch.h $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/inc_user_config.h \
+ $(ACE_ROOT)/ace/config.h \
+ $(ACE_ROOT)/ace/config-sunos5.5.h \
+ $(ACE_ROOT)/ace/config-g++-common.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/OS.i $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
+ $(ACE_ROOT)/ace/Synch.i $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp
+.obj/http_headers.o .obj/http_headers.so .shobj/http_headers.o .shobj/http_headers.so: http_headers.cpp ../HTTPU/http_headers.h \
+ $(ACE_ROOT)/ace/RB_Tree.h $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/inc_user_config.h \
+ $(ACE_ROOT)/ace/config.h \
+ $(ACE_ROOT)/ace/config-sunos5.5.h \
+ $(ACE_ROOT)/ace/config-g++-common.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/OS.i $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ $(ACE_ROOT)/ace/RB_Tree.i \
+ $(ACE_ROOT)/ace/RB_Tree.cpp \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
+ $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
+ $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
+ $(ACE_ROOT)/ace/Synch.i $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp ../JAWS/Parse_Headers.h \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(ACE_ROOT)/ace/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Message_Block.i ../JAWS/Headers.h
+
+# IF YOU PUT ANYTHING HERE IT WILL GO AWAY
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/http_base.cpp b/apps/JAWS/PROTOTYPE/HTTPU/http_base.cpp
new file mode 100644
index 00000000000..7d129e8daea
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/http_base.cpp
@@ -0,0 +1,319 @@
+// $Id$
+
+#include "JAWS/Parse_Headers.h"
+#include "HTTPU/http_base.h"
+#include "HTTPU/http_headers.h"
+
+int
+HTTP_Base::receive (ACE_Message_Block &mb)
+{
+ if (this->line () == 0)
+ {
+ if (this->extract_line (mb) == 0)
+ return 0;
+ if (this->status () != STATUS_OK)
+ return 1;
+
+ // Call into the receive hook.
+ this->parse_line ();
+ if (this->status_ == STATUS_INTERNAL_SERVER_ERROR || this->no_headers_)
+ return 1;
+ }
+
+ // Parse headers
+ JAWS_Parse_Headers *parser = JAWS_Parse_Headers_Singleton::instance ();
+ int ret = parser->parse_headers (&(this->info_), mb);
+
+ switch (this->info_.status ())
+ {
+ case JAWS_Header_Info::OK:
+ break;
+
+ case JAWS_Header_Info::NO_MEMORY:
+ case JAWS_Header_Info::TOO_LONG:
+ default:
+ this->status_ = STATUS_INTERNAL_SERVER_ERROR;
+ break;
+ }
+
+ return ret;
+}
+
+int
+HTTP_Base::deliver (ACE_Message_Block &mb)
+{
+ JAWS_Header_Data *data = 0;
+
+ // Deliver this outgoing request.
+ // We do this by building the request up and writing it into the
+ // message block.
+ if (this->mb_ == 0)
+ {
+ // Make our Message Block big enough to hold a header name and
+ // header value
+ this->mb_ = new ACE_Message_Block (16384); // MAGIC! 2 x 8192
+ if (this->mb_ == 0)
+ {
+ this->status_ = STATUS_INTERNAL_SERVER_ERROR;
+ return -1;
+ }
+
+ // Call into the deliver hook
+ int r = this->espouse_line ();
+ if (r == -1)
+ return -1;
+
+ if (r == 1)
+ this->deliver_state_ = 2;
+
+ this->iter_.first ();
+ }
+
+ while (this->deliver_state_ < 3)
+ {
+ // Deliver whatever is currently held in this->mb_.
+ size_t sz = (mb.space () < this->mb_->length ()
+ ? mb.space ()
+ : this->mb_->length ());
+
+ if (sz > 0)
+ {
+ mb.copy (this->mb_->rd_ptr (), sz);
+ this->mb_->rd_ptr (sz);
+ }
+
+ if (mb.space () == 0)
+ return 0;
+
+ // Arriving here means this->mb_ has been emptied.
+ this->mb_->crunch ();
+
+ switch (this->deliver_state_)
+ {
+ case 0: // Obtain the next header data // Deliver a header name
+ this->deliver_state_ = this->deliver_header_name (data);
+ break;
+
+ case 1: // Deliver a header value
+ this->deliver_state_ = this->deliver_header_value (data);
+ break;
+
+ case 2: // Finished!
+ delete this->mb_;
+ this->mb_ = 0;
+ this->deliver_state_ = 3;
+ }
+ }
+
+ return 1;
+}
+
+int
+HTTP_Base::receive_payload (ACE_Message_Block &mb)
+{
+ int result = 0;
+
+ if (this->payload_.space () < mb.length ())
+ result = this->payload_.size (this->payload_.size () +
+ mb.length () - this->payload_.space ());
+
+ if (result == 0)
+ {
+ this->payload_.copy (mb.rd_ptr (), mb.length ());
+ mb.rd_ptr (mb.wr_ptr ());
+ mb.crunch ();
+ }
+ else
+ this->status_ = STATUS_INTERNAL_SERVER_ERROR;
+
+ return result;
+}
+
+int
+HTTP_Base::receive_payload (ACE_Message_Block &mb, long length)
+{
+ int result = 0;
+
+ if (length == -1)
+ return this->receive_payload (mb);
+
+ if (this->payload_.size () < (unsigned long) length)
+ result = this->payload_.size (length);
+
+ if (result == -1)
+ {
+ this->status_ = STATUS_INTERNAL_SERVER_ERROR;
+ return -1;
+ }
+
+ if (this->payload_.space () >= mb.length ())
+ {
+ this->payload_.copy (mb.rd_ptr (), mb.length ());
+ mb.rd_ptr (mb.wr_ptr ());
+ mb.crunch ();
+ }
+ else
+ {
+ size_t space = this->payload_.space ();
+ this->payload_.copy (mb.rd_ptr (), space);
+ mb.rd_ptr (space);
+ }
+
+ return this->payload_.length () == (unsigned long) length;
+}
+
+const char *
+HTTP_Base::payload (void)
+{
+ return this->payload_.rd_ptr ();
+}
+
+unsigned long
+HTTP_Base::payload_size (void)
+{
+ return this->payload_.length ();
+}
+
+int
+HTTP_Base::build_headers (JAWS_Headers *new_headers)
+{
+ JAWS_Header_Data *data = 0;
+ JAWS_Header_Data *data2 = 0;
+ JAWS_Header_Table_Iterator iter (*new_headers);
+
+ iter.first ();
+ while (! iter.done ())
+ {
+ data = iter.next ();
+ if (data == 0)
+ {
+ iter.advance ();
+ continue;
+ }
+
+ if (data->header_type () == HTTP_HCodes::REPLACE_HEADER)
+ this->headers ()->remove_all (data->header_name ());
+ else if (data->header_type () == HTTP_HCodes::INSERT_HEADER
+ || data->header_type () == HTTP_HCodes::APPENDTO_HEADER)
+ {
+ data2 = this->headers ()->find (data->header_name ());
+ if (data2 != 0)
+ {
+ if (data->header_type () == HTTP_HCodes::APPENDTO_HEADER)
+ {
+ // Append to existing header
+ size_t len
+ = ACE_OS::strlen (data->header_value ())
+ + ACE_OS::strlen (data2->header_value ())
+ + 3; /* for comma, space, and nul */
+ char *buf = new char [len];
+ if (buf == 0)
+ {
+ this->status_ = STATUS_INTERNAL_SERVER_ERROR;
+ return -1;
+ }
+ ACE_OS::sprintf (buf, "%s, %s",
+ data2->header_value (),
+ data->header_value ());
+ data2->header_value (buf);
+ delete [] buf;
+ }
+
+ // Only insert if it isn't already present
+ iter.advance ();
+ continue;
+ }
+ }
+
+ data2 = new JAWS_Header_Data (data->header_name (),
+ data->header_value ());
+ if (data2 == 0 || data2->header_name () == 0
+ || data2->header_value () == 0)
+ {
+ this->status_ = STATUS_INTERNAL_SERVER_ERROR;
+ return -1;
+ }
+ this->headers ()->insert (data2);
+
+ iter.advance ();
+ }
+
+ return 0;
+}
+
+int
+HTTP_Base::deliver_header_name (JAWS_Header_Data *&data)
+{
+ data = 0;
+
+ for (;;)
+ {
+ if ((data = this->iter_.next ()) == 0)
+ {
+ // No more headers, deliver final "\r\n"
+ this->mb_->copy ("\r\n", 2);
+ return 2;
+ }
+
+ if (data->header_name ())
+ break;
+
+ this->iter_.advance ();
+ }
+
+ // Assume the following lines will always succeed.
+ this->mb_->copy (data->header_name ());
+ this->mb_->wr_ptr (this->mb_->wr_ptr () - 1);
+ this->mb_->copy (": ", 2);
+
+ return 1;
+}
+
+int
+HTTP_Base::deliver_header_value (JAWS_Header_Data *&data)
+{
+ // Assume the following line will always succeed.
+ if (data->header_value ())
+ {
+ this->mb_->copy (data->header_value ());
+ this->mb_->wr_ptr (this->mb_->wr_ptr () - 1);
+ }
+ this->mb_->copy ("\r\n", 2);
+
+ this->iter_.advance ();
+ return 0;
+}
+
+
+int
+HTTP_Base::extract_line (ACE_Message_Block &mb)
+{
+ JAWS_Parse_Headers *parser = JAWS_Parse_Headers_Singleton::instance ();
+ char *p = parser->skipset ("\n", mb.rd_ptr (), mb.wr_ptr ());
+ if (p == mb.wr_ptr ())
+ return 0;
+
+ this->status_ = STATUS_OK;
+
+ *p = '\0';
+ if (p[-1] == '\r')
+ p[-1] = '\0';
+
+ this->line_ = ACE_OS::strdup (mb.rd_ptr ());
+ if (this->line_ == 0)
+ this->status_ = STATUS_INTERNAL_SERVER_ERROR;
+
+ mb.rd_ptr (p+1);
+ this->info_.end_of_line (1);
+ return 1;
+}
+
+void
+HTTP_Base::dump (void)
+{
+ ACE_DEBUG ((LM_DEBUG, "%s\n", this->line ()));
+ this->info_.dump ();
+ ACE_DEBUG ((LM_DEBUG, "STATUS IS %d %s\n",
+ this->status (),
+ (*HTTP_SCode::instance ())[this->status ()]));
+}
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/http_base.h b/apps/JAWS/PROTOTYPE/HTTPU/http_base.h
new file mode 100644
index 00000000000..4fe57a83217
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/http_base.h
@@ -0,0 +1,88 @@
+// $Id$
+
+#if !defined (HTTPU_HTTP_BASE_H)
+#define HTTPU_HTTP_BASE_H
+
+#include "ace/Message_Block.h"
+
+#include "JAWS/Parse_Headers.h"
+#include "HTTPU/http_status.h"
+#include "HTTPU/http_headers.h"
+
+class HTTP_Base : public HTTP_SCode_Base
+{
+public:
+
+ HTTP_Base (void)
+ : status_ (200),
+ line_ (0),
+ deliver_state_ (0),
+ no_headers_ (0),
+ iter_ (*(this->info_.table ())),
+ mb_ (0)
+ {}
+ virtual ~HTTP_Base (void)
+ {
+ if (this->line_)
+ ACE_OS::free (this->line_);
+ if (this->mb_)
+ delete this->mb_;
+ this->line_ = 0;
+ this->mb_ = 0;
+ }
+
+ virtual int receive (ACE_Message_Block &mb);
+ virtual int deliver (ACE_Message_Block &mb);
+
+ virtual int receive_payload (ACE_Message_Block &mb);
+ virtual int receive_payload (ACE_Message_Block &mb, long length);
+
+ const char * payload (void);
+ unsigned long payload_size (void);
+
+ int status (void) const { return this->status_; }
+ const char *line (void) const { return this->line_; }
+ HTTP_Headers *http_headers (void) { return &(this->info_); }
+ JAWS_Headers *headers (void) { return this->info_.table (); }
+
+ int build_headers (JAWS_Headers *new_headers);
+ // takes a set of new headers that will replace existing headers or
+ // be added to the header list if there is no corresponding one to replace.
+
+ void dump (void);
+
+protected:
+
+ virtual void parse_line (void) = 0;
+ // Hook into the receive function to do specialized parsing of initial line.
+ // Sets the status_ variable.
+
+ virtual int espouse_line (void) = 0;
+ // Hook into the deliver function to do specialized initial line creation.
+ // Returns 0 for success and -1 for failure.
+
+ int deliver_header_name (JAWS_Header_Data *&data);
+ // Returns the next deliver state
+
+ int deliver_header_value (JAWS_Header_Data *&data);
+ // Returns the next deliver state
+
+ virtual int extract_line (ACE_Message_Block &mb);
+ // The first line of a request or a response.
+ // Return 0 if more data needed.
+ // Return 1 if line successfully parsed.
+
+protected:
+
+ int status_;
+ char *line_;
+ int deliver_state_;
+ int no_headers_;
+ HTTP_Headers info_;
+ JAWS_Header_Table_Iterator iter_;
+ ACE_Message_Block *mb_;
+ ACE_Message_Block payload_;
+
+};
+
+#endif /* !defined (HTTPU_HTTP_BASE_H) */
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/http_headers.cpp b/apps/JAWS/PROTOTYPE/HTTPU/http_headers.cpp
new file mode 100644
index 00000000000..2f82e0341ef
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/http_headers.cpp
@@ -0,0 +1,137 @@
+// $Id$
+
+#include "HTTPU/http_headers.h"
+
+HTTP_Hdr_Node
+
+ HTTP_HCodes::HTTP ("HTTP", "HTTP%s %s"),
+ HTTP_HCodes::ACCEPT ("Accept", "Accept: %s\r\n"),
+ HTTP_HCodes::ACCEPTCHARSET ("Accept-Charset", "Accept-Charset: %s\r\n"),
+ HTTP_HCodes::ACCEPTENCODING ("Accept-Encoding", "Accept-Encoding: %s\r\n"),
+ HTTP_HCodes::ACCEPTLANGUAGE ("Accept-Language", "Accept-Language: %s\r\n"),
+ HTTP_HCodes::ACCEPTRANGES ("Accept-Ranges", "Accept-Ranges: %s\r\n"),
+ HTTP_HCodes::AGE ("Age", "Age: %s\r\n"),
+ HTTP_HCodes::ALLOW ("Allow", "Allow: %s\r\n"),
+ HTTP_HCodes::AUTHORIZATION ("Authorization", "Authorization: %s\r\n"),
+ HTTP_HCodes::CACHECONTROL ("Cache-Control", "Cache-Control: %s\r\n"),
+ HTTP_HCodes::CONNECTION ("Connection", "Connection: %s\r\n"),
+ HTTP_HCodes::CONTENTENCODING ("Content-Encoding",
+ "Content-Encoding: %d\r\n"),
+ HTTP_HCodes::CONTENTLENGTH ("Content-Length", "Content-Length: %d\r\n"),
+ HTTP_HCodes::CONTENTLOCATION ("Content-Location", "Content-Location: %s\r\n"),
+ HTTP_HCodes::CONTENTMD5 ("Content-MD5", "Content-MD5: %s\r\n"),
+ HTTP_HCodes::CONTENTRANGE ("Content-Range", "Content-Range: %s\r\n"),
+ HTTP_HCodes::CONTENTTYPE ("Content-Type", "Content-Type: %s\r\n"),
+ HTTP_HCodes::DATE ("Date", "Date: %s\r\n"),
+ HTTP_HCodes::ETAG ("ETag", "ETag: %s\r\n"),
+ HTTP_HCodes::EXPECT ("Expect", "Expect: %s\r\n"),
+ HTTP_HCodes::EXPIRES ("Expires", "Expires: %s\r\n"),
+ HTTP_HCodes::FROM ("From", "From: %s\r\n"),
+ HTTP_HCodes::HOST ("Host", "Host: %s\r\n"),
+ HTTP_HCodes::IFMATCH ("If-Match", "If-Match: %s\r\n"),
+ HTTP_HCodes::IFMODIFIEDSINCE ("If-Modified-Since",
+ "If-Modified-Since: %s\r\n"),
+ HTTP_HCodes::IFNONEMATCH ("If-None-Match", "If-None-Match: %s\r\n"),
+ HTTP_HCodes::IFRANGE ("If-Range", "If-Range: %s\r\n"),
+ HTTP_HCodes::IFUNMODIFIEDSINCE ("If-Unmodified-Since",
+ "If-Unmodified-Since: %s\r\n"),
+ HTTP_HCodes::LASTMODIFIED ("Last-Modified", "Last-Modified: %s\r\n"),
+ HTTP_HCodes::LOCATION ("Location", "Location: %s\r\n"),
+ HTTP_HCodes::MAXFORWARDS ("Max-Forwards", "Max-Forwards: %s\r\n"),
+ HTTP_HCodes::PRAGMA ("Pragma", "Pragma: %s\r\n"),
+ HTTP_HCodes::PROXYAUTHENTICATE ("Proxy-Authenticate",
+ "Proxy-Authenticate: %s\r\n"),
+ HTTP_HCodes::PROXYAUTHORIZATION ("Proxy-Authorization",
+ "Proxy-Authorization: %s\r\n"),
+ HTTP_HCodes::RANGE ("Range", "Range: %s\r\n"),
+ HTTP_HCodes::REFERER ("Referer", "Referer: %s\r\n"),
+ HTTP_HCodes::SERVER ("Server", "Server: %s\r\n"),
+ HTTP_HCodes::TE ("TE", "TE: %s\r\n"),
+ HTTP_HCodes::TRAILER ("Trailer", "Trailer: %s\r\n"),
+ HTTP_HCodes::TRANSFERENCODING ("Transfer-Encoding",
+ "Transfer-Encoding: %s\r\n"),
+ HTTP_HCodes::UPGRADE ("Ugrade", "Ugrade: %s\r\n"),
+ HTTP_HCodes::USERAGENT ("User-Agent", "User-Agent: %s\r\n"),
+ HTTP_HCodes::VARY ("Vary", "Vary: %s\r\n"),
+ HTTP_HCodes::VIA ("Via", "Via: %s\r\n"),
+ HTTP_HCodes::WARNING ("Warning", "Warning: %s\r\n"),
+ HTTP_HCodes::WWWAUTHENTICATE ("WWW-Authenticate",
+ "WWW-Authenticate: %s\r\n"),
+ HTTP_HCodes::GET ("GET", "GET %s HTTP/%s\r\n"),
+ HTTP_HCodes::HEAD ("HEAD", "HEAD %s HTTP/%s\r\n"),
+ HTTP_HCodes::POST ("POST", "POST %s HTTP/%s\r\n"),
+ HTTP_HCodes::PUT ("PUT", "PUT %s HTTP/%s\r\n"),
+ HTTP_HCodes::QUIT ("QUIT", "QUIT %s HTTP/%s\r\n"),
+ HTTP_HCodes::DUNNO ("", ""),
+ HTTP_HCodes::META ("<META", "<META %s>"),
+ HTTP_HCodes::A ("<A", "<A %s>"),
+ HTTP_HCodes::SCRIPT ("<SCRIPT", "<SCRIPT %s>"),
+ HTTP_HCodes::APPLET ("<APPLET", "<APPLET %s>")
+
+ //////////////
+ ;
+
+
+const int &HTTP_HCodes::NUM_HEADER_STRINGS
+ = HTTP_Header_Nodes_Singleton::instance ()->num_header_strings_;
+
+HTTP_Hdr_Node::HTTP_Hdr_Node (const char *token, const char *format)
+ : token_ (token),
+ format_ (format)
+{
+ HTTP_Header_Nodes *header_nodes
+ = HTTP_Header_Nodes_Singleton::instance ();
+
+ this->index_ = header_nodes->num_header_strings_;
+ header_nodes->insert (this->index_, this);
+ header_nodes->num_header_strings_++;
+}
+
+const char *
+HTTP_Headers::header (int name) const
+{
+ return this->header_token (name);
+}
+
+const char *
+HTTP_Headers::value (int index)
+{
+ this->value_reset ();
+ return this->value_next (index);
+}
+
+const char *
+HTTP_Headers::value_next (int index)
+{
+ const char *hs = 0;
+ const char *hv = 0;
+ JAWS_Header_Data *data;
+
+ if (0 <= index && index < NUM_HEADER_STRINGS)
+ {
+ hs = this->header (index);
+ data = this->table ()->find_next (hs);
+ if (data != 0)
+ hv = data->header_value ();
+ }
+
+ return hv;
+}
+
+void
+HTTP_Headers::value_reset (void)
+{
+ this->table ()->iter ().first ();
+}
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+template class RB_Tree<int, const HTTP_Hdr_Node *>;
+template class RB_Tree_Node<int, const HTTP_Hdr_Node *>;
+template class RB_Tree_Iterator<int, const HTTP_Hdr_Node *>;
+template class ACE_Singleton<HTTP_Header_Nodes, ACE_SYNCH_MUTEX>;
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+#pragma instantiate RB_Tree<int, const HTTP_Hdr_Node *>
+#pragma instantiate RB_Tree_Node<int, const HTTP_Hdr_Node *>
+#pragma instantiate RB_Tree_Iterator<int, const HTTP_Hdr_Node *>
+#pragma instantiate ACE_Singleton<HTTP_Header_Nodes, ACE_SYNCH_MUTEX>
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/http_headers.h b/apps/JAWS/PROTOTYPE/HTTPU/http_headers.h
new file mode 100644
index 00000000000..1d2df99a3e2
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/http_headers.h
@@ -0,0 +1,169 @@
+// $Id$
+
+// by James Hu
+// Borrowed from HTTP_Headers.*, which appears to be irrelevent now anyway.
+
+#if !defined (HTTPU_HTTP_HEADERS_H)
+#define HTTPU_HTTP_HEADERS_H
+
+#include "ace/RB_Tree.h"
+#include "ace/Singleton.h"
+
+#include "JAWS/Parse_Headers.h"
+
+class HTTP_Headers;
+
+class HTTP_Hdr_Node
+{
+ // Constructor should be passed literal strings.
+ friend class HTTP_HCodes;
+
+public:
+ operator const int (void) const { return this->index_; }
+ operator const char * (void) const { return this->token_; }
+ const char * format (void) const { return this->format_; }
+
+private:
+ HTTP_Hdr_Node (const char *token, const char *format);
+
+private:
+ int index_;
+ const char *token_;
+ const char *format_;
+};
+
+
+class HTTP_HCodes;
+
+class HTTP_Header_Nodes : public RB_Tree<int, const HTTP_Hdr_Node *>
+{
+ friend class HTTP_HCodes;
+ friend class HTTP_Hdr_Node;
+
+public:
+ HTTP_Header_Nodes (void) : num_header_strings_ (0) {}
+
+private:
+ int num_header_strings_;
+};
+
+typedef ACE_Singleton<HTTP_Header_Nodes, ACE_SYNCH_MUTEX>
+ HTTP_Header_Nodes_Singleton;
+
+class HTTP_HCodes
+{
+public:
+ HTTP_HCodes (void)
+ : header_nodes_ (HTTP_Header_Nodes_Singleton::instance ())
+ {}
+
+ enum {
+ REPLACE_HEADER = 1, // Remove any existing header that matches first
+ APPEND_HEADER = 2, // Unconditionally append the header
+ INSERT_HEADER = 4, // Insert header if one does not already exist
+ APPENDTO_HEADER = 8 // Concatenate data to existing header value
+ };
+
+ static HTTP_Hdr_Node
+ HTTP,
+ ACCEPT,
+ ACCEPTCHARSET,
+ ACCEPTENCODING,
+ ACCEPTLANGUAGE,
+ ACCEPTRANGES,
+ AGE,
+ ALLOW,
+ AUTHORIZATION,
+ CACHECONTROL,
+ CONNECTION,
+ CONTENTENCODING,
+ CONTENTLENGTH,
+ CONTENTLOCATION,
+ CONTENTMD5,
+ CONTENTRANGE,
+ CONTENTTYPE,
+ DATE,
+ ETAG,
+ EXPECT,
+ EXPIRES,
+ FROM,
+ HOST,
+ IFMATCH,
+ IFMODIFIEDSINCE,
+ IFNONEMATCH,
+ IFRANGE,
+ IFUNMODIFIEDSINCE,
+ LASTMODIFIED,
+ LOCATION,
+ MAXFORWARDS,
+ PRAGMA,
+ PROXYAUTHENTICATE,
+ PROXYAUTHORIZATION,
+ RANGE,
+ REFERER,
+ RETRYAFTER,
+ SERVER,
+ TE,
+ TRAILER,
+ TRANSFERENCODING,
+ UPGRADE,
+ USERAGENT,
+ VARY,
+ VIA,
+ WARNING,
+ WWWAUTHENTICATE,
+ GET,
+ HEAD,
+ POST,
+ PUT,
+ QUIT,
+ DUNNO,
+ META,
+ A,
+ SCRIPT,
+ APPLET
+ ;
+
+ static const int &NUM_HEADER_STRINGS;
+
+protected:
+
+ const HTTP_Hdr_Node &hcode (int type) const
+ {
+ const HTTP_Hdr_Node **hn = this->header_nodes_->find (type);
+
+ // No error checking!
+ return **hn;
+ }
+
+protected:
+
+ HTTP_Header_Nodes *header_nodes_;
+};
+
+class HTTP_Headers : public JAWS_Header_Info, public HTTP_HCodes
+{
+public:
+ const char *header( int name ) const;
+ const char *value( int name );
+ const char *value_next( int name );
+ void value_reset ( void );
+
+public:
+ HTTP_Headers (void) {}
+
+ const char *header_token (int name) const
+ {
+ const HTTP_Hdr_Node **hn = this->header_nodes_->find (name);
+ return ((hn && *hn) ? (const char *)**hn : 0);
+ }
+
+ const char *header_strings (int name) const
+ {
+ const HTTP_Hdr_Node **hn = this->header_nodes_->find (name);
+ return ((hn && *hn) ? (*hn)->format () : 0);
+ }
+
+};
+
+#endif /* !defined (HTTPU_HTTP_HEADERS_HPP) */
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/http_request.cpp b/apps/JAWS/PROTOTYPE/HTTPU/http_request.cpp
new file mode 100644
index 00000000000..7ab8dca99a4
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/http_request.cpp
@@ -0,0 +1,82 @@
+// $Id$
+
+#include "HTTPU/http_request.h"
+#include "HTTPU/parse_http_request.h"
+
+void
+HTTP_Request::parse_line (void)
+{
+ this->status_ = STATUS_OK;
+
+ this->request_.init (this->line ());
+ if (this->request_.error () != Parse_HTTP_Request::HTTPU_OK)
+ {
+ this->status_ = STATUS_INTERNAL_SERVER_ERROR;
+ return;
+ }
+ if (this->request_.major_version () == 0)
+ {
+ this->no_headers_ = 1;
+ return;
+ }
+
+ this->url_.init (this->request_.url ());
+ if (this->url_.error () != 0)
+ this->status_ = STATUS_INTERNAL_SERVER_ERROR;
+}
+
+int
+HTTP_Request::espouse_line (void)
+{
+ int count;
+
+ if (this->request_.major_version () == 0)
+ {
+ count = ACE_OS::sprintf (this->mb_->wr_ptr (), "%s /%s\r\n\r\n",
+ this->request_.method_str (),
+ this->url_.url_path ());
+
+ if (count < 0)
+ return -1;
+
+ this->mb_->wr_ptr (count);
+
+ return 1;
+ }
+
+ count = ACE_OS::sprintf (this->mb_->wr_ptr (), "%s /%s %s\r\n",
+ this->request_.method_str (),
+ this->url_.url_path (),
+ this->request_.version ());
+
+ if (count < 0)
+ return -1;
+
+ this->mb_->wr_ptr (count);
+
+ if (this->url_.host () != 0)
+ {
+ JAWS_Header_Data *hd = this->headers ()->find ("Host");
+ if (hd == 0)
+ {
+ count = ACE_OS::sprintf (this->mb_->wr_ptr (), "Host: %s\r\n",
+ this->url_.host ());
+
+ if (count < 0)
+ return -1;
+
+ this->mb_->wr_ptr (count);
+ }
+ }
+
+ return 0;
+}
+
+void
+HTTP_Request::dump (void)
+{
+ ACE_DEBUG ((LM_DEBUG, "===== BEGIN entera_HTTP_Request::dump =====\n"));
+ HTTP_Base::dump ();
+ this->request_.dump ();
+ ACE_DEBUG ((LM_DEBUG, "===== END entera_HTTP_Request::dump =====\n"));
+}
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/http_request.h b/apps/JAWS/PROTOTYPE/HTTPU/http_request.h
new file mode 100644
index 00000000000..3226b62bb6d
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/http_request.h
@@ -0,0 +1,47 @@
+// $Id$
+
+// There are two kinds of HTTP Requests in a proxy.
+// One is the kind you have to read in from the HTTP client.
+// The other is the kind you issue to the server.
+
+#if !defined (HTTPU_HTTP_REQUEST_HPP)
+#define HTTPU_HTTP_REQUEST_HPP
+
+#include "ace/Message_Block.h"
+
+#include "JAWS/Parse_Headers.h"
+#include "HTTPU/http_base.h"
+#include "HTTPU/parse_http_request.h"
+#include "HTTPU/parse_url.h"
+
+class HTTP_Request : public HTTP_Base
+{
+public:
+ HTTP_Request (void) {}
+ virtual ~HTTP_Request (void) {}
+
+ Parse_HTTP_Request *request_line (void) { return &(this->request_); }
+ // Returns the parsed request line.
+
+ const Parse_HTTP_Request *request_line (void) const
+ {
+ return &(this->request_);
+ }
+ // Returns the parsed request line.
+
+ HTTP_Parse_URL *url (void) { return &(this->url_); }
+ // Returns the parsed url.
+
+ void dump (void);
+
+protected:
+
+ virtual void parse_line (void);
+ virtual int espouse_line (void);
+
+private:
+ Parse_HTTP_Request request_;
+ HTTP_Parse_URL url_;
+};
+
+#endif /* !defined (HTTPU_HTTP_REQUEST_HPP) */
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/http_response.cpp b/apps/JAWS/PROTOTYPE/HTTPU/http_response.cpp
new file mode 100644
index 00000000000..e894b2726f2
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/http_response.cpp
@@ -0,0 +1,45 @@
+// $Id$
+
+#include "HTTPU/http_response.h"
+
+void
+HTTP_Response::parse_line (void)
+{
+ this->response_.init (this->line ());
+ if (this->response_.error () != Parse_HTTP_Response::HTTPU_OK)
+ this->status_ = STATUS_INTERNAL_SERVER_ERROR;
+}
+
+int
+HTTP_Response::espouse_line (void)
+{
+ int count;
+ int status;
+
+ if (this->status_ != (int)STATUS_OK)
+ status = this->status_;
+ else
+ status = this->response_line ()->code ();
+
+ count = ACE_OS::sprintf (this->mb_->wr_ptr (), "%s %d %s\r\n",
+ "HTTP/1.1",
+ status,
+ (char *)(*HTTP_SCode::instance ())[status]);
+ // Last arg is hard coded since we are suppose to report the
+ // level of server we are, and not act like the level of the
+ // client. This information should be obtained from the config.
+
+ if (count < 0)
+ return -1;
+
+ this->mb_->wr_ptr (count);
+ return 0;
+}
+
+void
+HTTP_Response::dump (void)
+{
+ ACE_DEBUG ((LM_DEBUG, "===== BEGIN entera_HTTP_Response::dump =====\n"));
+ HTTP_Base::dump ();
+ ACE_DEBUG ((LM_DEBUG, "===== END entera_HTTP_Response::dump =====\n"));
+}
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/http_response.h b/apps/JAWS/PROTOTYPE/HTTPU/http_response.h
new file mode 100644
index 00000000000..cd3a44a4c06
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/http_response.h
@@ -0,0 +1,37 @@
+// $Id$
+
+// There are two kinds of HTTP Responses in a proxy.
+// One is the kind you have to read in from the HTTP server.
+// The other is the kind you issue to the HTTP client.
+
+#if !defined (HTTPU_HTTP_RESPONSE_HPP)
+#define HTTPU_HTTP_RESPONSE_HPP
+
+#include "ace/Message_Block.h"
+#include "JAWS/Parse_Headers.h"
+
+#include "HTTPU/http_base.h"
+#include "HTTPU/parse_http_response.h"
+
+class HTTP_Response : public HTTP_Base
+{
+public:
+ HTTP_Response (void) {}
+ ~HTTP_Response (void) {}
+
+ Parse_HTTP_Response *response_line (void)
+ { return &(this->response_); }
+ // Returns the parsed response line.
+
+ void dump (void);
+
+protected:
+
+ virtual void parse_line (void);
+ virtual int espouse_line (void);
+
+private:
+ Parse_HTTP_Response response_;
+};
+
+#endif /* !defined (HTTPU_HTTP_RESPONSE_HPP) */
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/http_status.cpp b/apps/JAWS/PROTOTYPE/HTTPU/http_status.cpp
new file mode 100644
index 00000000000..b2bf92c1a55
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/http_status.cpp
@@ -0,0 +1,78 @@
+// $Id$
+
+#include "HTTPU/http_status.h"
+
+const char *
+HTTP_SCode::table_ [HTTP_SCode::SC_TABLE_SIZE];
+
+HTTP_SCode_Node
+
+ HTTP_SCode_Base::STATUS_OK (200, "OK"),
+ HTTP_SCode_Base::STATUS_CREATED (201, "Created"),
+ HTTP_SCode_Base::STATUS_ACCEPTED (202, "Accepted"),
+ HTTP_SCode_Base::STATUS_NO_CONTENT (204, "No Content"),
+ HTTP_SCode_Base::STATUS_MULTIPLE_CHOICES (300, "Multiple Choices"),
+ HTTP_SCode_Base::STATUS_MOVED_PERMANENTLY (301, "Moved Permanently"),
+ HTTP_SCode_Base::STATUS_MOVED_TEMPORARILY (302, "Moved Temporarily"),
+ HTTP_SCode_Base::STATUS_NOT_MODIFIED (304, "Not Modified"),
+ HTTP_SCode_Base::STATUS_INSUFFICIENT_DATA (399, "Insufficient Data"),
+ HTTP_SCode_Base::STATUS_BAD_REQUEST (400, "Bad Request"),
+ HTTP_SCode_Base::STATUS_UNAUTHORIZED (401, "Unauthorized"),
+ HTTP_SCode_Base::STATUS_FORBIDDEN (403, "Forbidden"),
+ HTTP_SCode_Base::STATUS_NOT_FOUND (404, "Not Found"),
+ HTTP_SCode_Base::STATUS_INTERNAL_SERVER_ERROR (500, "Internal Server Error"),
+ HTTP_SCode_Base::STATUS_NOT_IMPLEMENTED (501, "Not Implemented"),
+ HTTP_SCode_Base::STATUS_BAD_GATEWAY (502, "Bad Gateway"),
+ HTTP_SCode_Base::STATUS_SERVICE_UNAVAILABLE (503, "Service Unavailable"),
+ HTTP_SCode_Base::STATUS_QUIT (599, "Quit"),
+
+ HTTP_SCode_Base::DUMMY (0, 0);
+
+HTTP_SCode_Node::HTTP_SCode_Node (int code, const char *code_str)
+ : code_ (code),
+ code_str_ (code_str)
+{
+ if ((HTTP_SCode::MIN_STATUS_CODE <= code)
+ && (code <= HTTP_SCode::MAX_STATUS_CODE))
+ HTTP_SCode::table_[code - HTTP_SCode::MIN_STATUS_CODE] = code_str;
+}
+
+const char *
+HTTP_SCode::operator[] (int i) const
+{
+ const char *s = "Unknown";
+
+ if (MIN_STATUS_CODE <= i && i <= MAX_STATUS_CODE)
+ s = this->table_[i - MIN_STATUS_CODE];
+
+ return s;
+}
+
+HTTP_SCode *
+HTTP_SCode::instance (void)
+{
+ return HTTP_SCode_Singleton::instance ();
+}
+
+void
+HTTP_SCode::dump (void)
+{
+ for (int i = 0; i < SC_TABLE_SIZE; i++)
+ ACE_DEBUG ((LM_DEBUG, "%s\n", this->table_[i]));
+}
+
+HTTP_SCode::HTTP_SCode (void)
+{
+ int i;
+ for (i = 0; i < SC_TABLE_SIZE; i++)
+ {
+ if (this->table_[i] == 0)
+ this->table_[i] = this->table_[(i/100) * 100];
+ }
+}
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+template class ACE_Singleton<HTTP_SCode, ACE_Thread_Mutex>;
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+#pragma instantiate ACE_Singleton<HTTP_SCode, ACE_Thread_Mutex>
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/http_status.h b/apps/JAWS/PROTOTYPE/HTTPU/http_status.h
new file mode 100644
index 00000000000..b9f6cb6b33f
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/http_status.h
@@ -0,0 +1,96 @@
+// $Id$
+
+#ifndef HTTPU_HTTP_STATUS_HPP
+#define HTTPU_HTTP_STATUS_HPP
+
+#include "ace/Singleton.h"
+
+class HTTP_SCode_Base;
+
+class HTTP_SCode_Node
+// Constructor should be passed a string literal.
+{
+ friend class HTTP_SCode_Base;
+
+public:
+ operator int (void) const { return this->code_; }
+ operator const char * (void) const { return this->code_str_; }
+
+private:
+ HTTP_SCode_Node (int code, const char *code_str);
+
+private:
+ int code_;
+ const char *code_str_;
+};
+
+class HTTP_SCode_Base
+{
+public:
+ static HTTP_SCode_Node STATUS_OK;
+ static HTTP_SCode_Node STATUS_CREATED;
+ static HTTP_SCode_Node STATUS_ACCEPTED;
+ static HTTP_SCode_Node STATUS_NO_CONTENT;
+ static HTTP_SCode_Node STATUS_MULTIPLE_CHOICES;
+ static HTTP_SCode_Node STATUS_MOVED_PERMANENTLY;
+ static HTTP_SCode_Node STATUS_MOVED_TEMPORARILY;
+ static HTTP_SCode_Node STATUS_NOT_MODIFIED;
+ static HTTP_SCode_Node STATUS_INSUFFICIENT_DATA;
+ static HTTP_SCode_Node STATUS_BAD_REQUEST;
+ static HTTP_SCode_Node STATUS_UNAUTHORIZED;
+ static HTTP_SCode_Node STATUS_FORBIDDEN;
+ static HTTP_SCode_Node STATUS_NOT_FOUND;
+ static HTTP_SCode_Node STATUS_INTERNAL_SERVER_ERROR;
+ static HTTP_SCode_Node STATUS_NOT_IMPLEMENTED;
+ static HTTP_SCode_Node STATUS_BAD_GATEWAY;
+ static HTTP_SCode_Node STATUS_SERVICE_UNAVAILABLE;
+ static HTTP_SCode_Node STATUS_QUIT;
+
+ enum
+ {
+ MIN_STATUS_CODE = 200,
+ MAX_STATUS_CODE = 599
+ };
+
+private:
+ static HTTP_SCode_Node DUMMY;
+};
+
+class HTTP_SCode : public HTTP_SCode_Base
+{
+ // = TITLE
+ // Go from numeric status codes to descriptive strings.
+ //
+ friend class HTTP_SCode_Node;
+ friend class ACE_Singleton<HTTP_SCode, ACE_SYNCH_MUTEX>;
+
+protected:
+
+ HTTP_SCode (void);
+ ~HTTP_SCode (void) {}
+
+public:
+
+ const char * operator[] (int) const;
+ // Return the reason string corresponding to a status code number.
+
+ static HTTP_SCode *instance (void);
+ // Return reference to the singleton.
+
+ enum
+ {
+ SC_TABLE_SIZE = MAX_STATUS_CODE - MIN_STATUS_CODE + 1
+ };
+
+ void dump (void);
+
+private:
+ static const char *table_[SC_TABLE_SIZE];
+};
+
+
+typedef ACE_Singleton<HTTP_SCode, ACE_SYNCH_MUTEX>
+ HTTP_SCode_Singleton;
+
+
+#endif /* HTTPU_HTTP_STATUS_HPP */
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/parse_http_request.cpp b/apps/JAWS/PROTOTYPE/HTTPU/parse_http_request.cpp
new file mode 100644
index 00000000000..854fe4d7bee
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/parse_http_request.cpp
@@ -0,0 +1,112 @@
+// $Id$
+
+#include "HTTPU/parse_http_request.h"
+
+Parse_HTTP_Request::Parse_HTTP_Request (const char *request)
+ : method_ (0),
+ major_version_ (-1),
+ minor_version_ (-1),
+ version_ (0),
+ url_ (0),
+ request_ (0),
+ error_ (0)
+{
+ if (request != 0)
+ this->init (request);
+}
+
+Parse_HTTP_Request::~Parse_HTTP_Request (void)
+{
+ if (this->request_)
+ ACE_OS::free (this->request_);
+ this->request_ = 0;
+ this->version_ = 0;
+ this->url_ = 0;
+}
+
+void
+Parse_HTTP_Request::dump (void)
+{
+ ACE_DEBUG ((LM_DEBUG, "%s %s %s\n",
+ this->method_str (), this->url (), this->version ()));
+}
+
+void
+Parse_HTTP_Request::init (const char *request)
+{
+ char *method;
+
+ this->request_ = ACE_OS::strdup (request);
+ if (this->request_ == 0)
+ {
+ this->error_ = NO_MEMORY;
+ return;
+ }
+
+ char buf[BUFSIZ];
+ int n = ::sscanf (this->request_, "%s %*s HTTP/%d.%d",
+ buf,
+ &(this->major_version_),
+ &(this->minor_version_));
+
+ if (n == 1 || n == 3)
+ {
+ char *p = this->request_;
+
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ method = p++;
+
+ while (*p != ' ' && *p != '\t')
+ p++;
+
+ *p++ = '\0';
+
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ this->url_ = p;
+
+ while (*p && !ACE_OS::strchr (" \t\r\n", *p))
+ p++;
+
+ *p++ = '\0';
+
+ if (n == 1)
+ {
+ this->major_version_ = 0;
+ this->minor_version_ = 9;
+ }
+ else
+ {
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ this->version_ = p;
+
+ while (*p && !ACE_OS::strchr (" \t\r\n", *p))
+ p++;
+
+ *p++ = '\0';
+ }
+
+ if (ACE_OS::strcmp (method, "GET") == 0)
+ this->method_ = &GET;
+ else if (ACE_OS::strcmp (method, "HEAD") == 0)
+ this->method_ = &HEAD;
+ else if (ACE_OS::strcmp (method, "POST") == 0)
+ this->method_ = &POST;
+ else if (ACE_OS::strcmp (method, "PUT") == 0)
+ this->method_ = &PUT;
+ else if (ACE_OS::strcmp (method, "QUIT") == 0)
+ this->method_ = &QUIT;
+ else
+ {
+ this->method_ = &DUNNO;
+ this->error_ = NOT_IMPLEMENTED;
+ }
+ }
+ else
+ this->error_ = BAD_REQUEST;
+}
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/parse_http_request.h b/apps/JAWS/PROTOTYPE/HTTPU/parse_http_request.h
new file mode 100644
index 00000000000..dcd369fe13d
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/parse_http_request.h
@@ -0,0 +1,47 @@
+// $Id$
+
+#if !defined (HTTPU_PARSE_HTTP_REQUEST_H)
+#define HTTPU_PARSE_HTTP_REQUEST_H
+
+#include "ace/OS.h"
+#include "HTTPU/http_headers.h"
+
+class Parse_HTTP_Request : public HTTP_HCodes
+{
+public:
+ Parse_HTTP_Request (const char *request = 0);
+ ~Parse_HTTP_Request (void);
+
+ void init (const char *request);
+
+ int method (void) const { return (int) *this->method_; }
+ const char *method_str (void) const { return (const char *) *this->method_; }
+
+ int major_version (void) const { return this->major_version_; }
+ int minor_version (void) const { return this->minor_version_; }
+
+ const char *version (void) const
+ { return this->version_ ? this->version_ : "HTTP/0.9"; }
+
+ const char *url (void) const { return this->url_; }
+
+ enum { HTTPU_OK, NO_MEMORY, BAD_REQUEST, NOT_IMPLEMENTED };
+
+ int error (void) { return this->error_; }
+ // 0 -> ok
+
+ void dump (void);
+
+private:
+
+ HTTP_Hdr_Node *method_;
+ int major_version_;
+ int minor_version_;
+ char *version_;
+ char *url_;
+ char *request_;
+ int error_;
+
+};
+
+#endif /* !defined (HTTPU_PARSE_HTTP_REQUEST_H) */
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/parse_http_response.cpp b/apps/JAWS/PROTOTYPE/HTTPU/parse_http_response.cpp
new file mode 100644
index 00000000000..1f8ad2eb0f6
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/parse_http_response.cpp
@@ -0,0 +1,69 @@
+// $Id$
+
+#include "HTTPU/parse_http_response.h"
+
+Parse_HTTP_Response::Parse_HTTP_Response (const char *response)
+ : code_ (200),
+ code_str_ (0),
+ major_version_ (0),
+ minor_version_ (9),
+ version_ (0),
+ response_ (0),
+ error_ (0)
+{
+ if (response != 0)
+ this->init (response);
+}
+
+Parse_HTTP_Response::~Parse_HTTP_Response (void)
+{
+ if (this->response_)
+ ACE_OS::free (this->response_);
+ this->response_ = 0;
+ this->code_str_ = 0;
+ this->version_ = 0;
+}
+
+void
+Parse_HTTP_Response::init (const char *response)
+{
+ this->response_ = ACE_OS::strdup (response);
+ if (this->response_ == 0)
+ {
+ this->error_ = NO_MEMORY;
+ return;
+ }
+
+ int n = ::sscanf (this->response_, "HTTP/%d.%d %d %*s",
+ &(this->major_version_),
+ &(this->minor_version_),
+ &(this->code_));
+
+ if (n == 3)
+ {
+ char *p = this->response_;
+
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ this->version_ = p++;
+
+ while (*p != ' ' && *p != '\t')
+ p++;
+
+ *p++ = '\0';
+
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ this->code_str_ = p;
+
+ while (*p && !ACE_OS::strchr (" \t\r\n", *p))
+ p++;
+
+ *p++ = '\0';
+ }
+ else
+ this->error_ = BAD_RESPONSE;
+}
+
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/parse_http_response.h b/apps/JAWS/PROTOTYPE/HTTPU/parse_http_response.h
new file mode 100644
index 00000000000..7cbf77aa134
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/parse_http_response.h
@@ -0,0 +1,43 @@
+// $Id$
+
+#if !defined (HTTPU_PARSE_HTTP_RESPONSE_H)
+#define HTTPU_PARSE_HTTP_RESPONSE_H
+
+#include "ace/OS.h"
+
+class Parse_HTTP_Response
+{
+public:
+ Parse_HTTP_Response (const char *response = 0);
+ ~Parse_HTTP_Response (void);
+
+ void init (const char *response);
+
+ int code (void) const { return this->code_; }
+ const char *code_str (void) const
+ { return this->code_str_ ? this->code_str_ : "200"; }
+
+ int major_version (void) const { return this->major_version_; }
+ int minor_version (void) const { return this->minor_version_; }
+
+ const char *version (void) const
+ { return this->version_ ? this->version_ : "HTTP/0.9"; }
+
+ enum { HTTPU_OK, NO_MEMORY, BAD_RESPONSE };
+
+ int error (void) { return this->error_; }
+ // 0 -> ok
+
+private:
+
+ int code_;
+ char *code_str_;
+ int major_version_;
+ int minor_version_;
+ char *version_;
+ char *response_;
+ int error_;
+
+};
+
+#endif /* !defined (HTTPU_PARSE_HTTP_RESPONSE_H) */
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/parse_url.cpp b/apps/JAWS/PROTOTYPE/HTTPU/parse_url.cpp
new file mode 100644
index 00000000000..abeabe4b233
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/parse_url.cpp
@@ -0,0 +1,316 @@
+// $Id$
+
+#include "ace/OS.h"
+#include "HTTPU/parse_url.h"
+
+HTTP_Parse_URL::HTTP_Parse_URL (const char *url)
+ : url_ (0),
+ scheme_ (0),
+ user_ (0),
+ passwd_ (0),
+ host_ (0),
+ port_ (-1),
+ url_path_ (0),
+ error_ (NONE),
+ is_cgi_ (0)
+{
+ this->init (url);
+}
+
+HTTP_Parse_URL::~HTTP_Parse_URL (void)
+{
+ if (this->url_)
+ ACE_OS::free (this->url_);
+ this->url_ = 0;
+ this->scheme_ = 0;
+ this->user_ = 0;
+ this->passwd_ = 0;
+ this->host_ = 0;
+ this->port_ = -1;
+ this->url_path_ = 0;
+}
+
+
+void
+HTTP_Parse_URL::init( const char *url )
+{
+ // Should really reset completely and cleanly here before
+ // doing anything else!
+ if ( url == 0 )
+ return;
+
+ if ( url_ )
+ ACE_OS::free( url_ );
+
+ url_ = ACE_OS::strdup( url );
+ if ( url_ == 0 )
+ {
+ error_ = STRDUP;
+ return;
+ }
+
+ if (ACE_OS::strlen (this->url_) > 3 && ACE_OS::strstr ("://", this->url_))
+ {
+ // Parse it out completely. Figure out what it is later.
+ parse_url();
+ }
+ else
+ {
+ this->url_path_ = this->url_;
+ this->is_cgi (this->url_path_);
+ }
+}
+
+
+void
+HTTP_Parse_URL::parse_url (void)
+{
+ char *p = this->url_;
+
+ char *q;
+ if ((q = ACE_OS::strchr (this->url_, '\r'))
+ || (q = ACE_OS::strchr (this->url_, '\n')))
+ *q = '\0';
+
+ this->parse_scheme (p);
+ if (*p == '\0')
+ {
+ this->error_ = SCHEME;
+ return;
+ }
+
+ // Parse past "//"
+ if (*p != '/' || *(p+1) != '/')
+ {
+ this->error_ = SLASHSLASH;
+ return;
+ }
+ p += 2;
+
+ this->parse_host (p);
+ if (*p == '/' || *p == '\0')
+ return;
+
+ this->url_path_ = p;
+ this->is_cgi (this->url_path_);
+}
+
+void
+HTTP_Parse_URL::parse_scheme (char *&p)
+{
+ // Parse the scheme. The scheme is delimited by a ':'.
+ if (*p != '\0')
+ {
+ this->scheme_ = p++;
+ for (;;)
+ {
+ switch (*p)
+ {
+ case '\0':
+ break;
+ case ':':
+ *p++ = '\0';
+ break;
+ default:
+ p++;
+ continue;
+ }
+ break;
+ }
+ }
+}
+
+void
+HTTP_Parse_URL::parse_host (char *&p)
+{
+ // Parse user, password, host, port
+ if (*p == '/' || *p == '\0')
+ {
+ this->set_port_from_scheme ();
+ return;
+ }
+
+ char *at = 0;
+ char *colon1 = 0;
+ char *colon2 = 0;
+ char *q = p;
+ while (*q != '\0')
+ {
+ if (*q == '/')
+ {
+ *q = '\0';
+ q++;
+ break;
+ }
+ if (*q == ':')
+ {
+ if (colon1 == 0)
+ {
+ if (at != 0 && colon2 == 0)
+ colon2 = q;
+ else
+ colon1 = q;
+ }
+ else
+ {
+ if (at != 0 && colon2 == 0)
+ colon2 = q;
+ }
+ }
+ if (*q == '@')
+ {
+ if (at == 0)
+ at = q;
+ }
+ q++;
+ }
+
+ // no user, no port
+ if (at == 0 && colon1 == 0)
+ {
+ if (*p != '\0' && *p != '/')
+ this->host_ = p;
+ }
+
+ // no user, port
+ else if (at == 0 && colon1 != 0)
+ {
+ if (p != colon1)
+ this->host_ = p;
+ *colon1++ = '\0';
+ this->port_ = ACE_OS::atoi (colon1);
+ }
+
+ // user, no passwd, no port
+ else if (at != 0 && colon1 == 0 && colon2 == 0)
+ {
+ this->user_ = p;
+ *at++ = '\0';
+ if (*at != '\0' && *at != '/')
+ this->host_ = at;
+ }
+
+ // user, no passwd, port
+ else if (at != 0 && colon1 == 0 && colon2 != 0)
+ {
+ this->user_ = p;
+ *at++ = '\0';
+ if (at != colon2)
+ this->host_ = at;
+ *colon2++ = '\0';
+ this->port_ = ACE_OS::atoi (colon2);
+ }
+
+ // user, passwd, no port
+ else if (at != 0 && colon1 != 0 && colon2 == 0)
+ {
+ this->user_ = p;
+ *colon1++ = '\0';
+ this->passwd_ = colon1;
+ *at++ = '\0';
+ if (*at != '\0')
+ this->host_ = at;
+ }
+
+ // user, passwd, and port
+ else if (at != 0 && colon1 != 0 && colon2 != 0)
+ {
+ this->user_ = p;
+ *colon1++ = '\0';
+ this->passwd_ = colon1;
+ *at++ = '\0';
+ if (at != colon2)
+ this->host_ = at;
+ *colon2++ = '\0';
+ this->port_ = ACE_OS::atoi (colon2);
+ }
+
+ // impossible!
+ else
+ {
+ ACE_ERROR ((LM_ERROR, "uh oh!\n"));
+ p = q;
+ return;
+ }
+
+ this->set_port_from_scheme ();
+ p = q;
+}
+
+void
+HTTP_Parse_URL::set_port_from_scheme (void)
+{
+ if (ACE_OS::strcmp (this->scheme_, "ftp") == 0)
+ {
+ if (this->port_ == -1)
+ this->port_ = 21;
+ if (this->user_ == 0)
+ {
+ this->user_ = "anonymous";
+
+ // *** need something better here
+ this->passwd_ = "a@b.c";
+ }
+ }
+ else if (ACE_OS::strcmp (this->scheme_, "http") == 0)
+ {
+ if (this->port_ == -1)
+ this->port_ = 80;
+ }
+}
+
+const char *
+HTTP_Parse_URL::scheme (void) const
+{
+ return this->scheme_;
+}
+
+const char *
+HTTP_Parse_URL::user (void) const
+{
+ return this->user_;
+}
+
+const char *
+HTTP_Parse_URL::passwd (void) const
+{
+ return this->passwd_;
+}
+
+const char *
+HTTP_Parse_URL::host (void) const
+{
+ return this->host_;
+}
+
+int
+HTTP_Parse_URL::port (void) const
+{
+ return this->port_;
+}
+
+const char *
+HTTP_Parse_URL::url_path (void) const
+{
+ return this->url_path_ ? this->url_path_ : "";
+}
+
+void
+HTTP_Parse_URL::is_cgi (const char *path)
+{
+ int yes;
+
+ yes = (ACE_OS::strchr (path, '?') != 0);
+ if (!yes && (ACE_OS::strlen (path) >= 3))
+ yes = (ACE_OS::strstr (path, "cgi") != 0);
+ if (!yes)
+ yes = (ACE_OS::strstr (path, "asp") != 0);
+
+ this->is_cgi_ = yes;
+}
+
+int
+HTTP_Parse_URL::is_cgi (void) const
+{
+ return this->is_cgi_;
+}
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/parse_url.h b/apps/JAWS/PROTOTYPE/HTTPU/parse_url.h
new file mode 100644
index 00000000000..fed7ab881b1
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/HTTPU/parse_url.h
@@ -0,0 +1,61 @@
+/* -*- c++ -*- */
+// $Id$
+
+#if !defined (HTTPU_HTTP_PARSE_H)
+#define HTTPU_HTTP_PARSE_H
+
+class HTTP_Parse_URL
+{
+ // CAVEAT:
+
+ // The user of the class is responsible for testing the difference
+ // between a missing username versus an empty one. Same goes for
+ // password The RFC (1738) makes the differentiation for username
+ // and password. If the hostname is missing (or empty), this class
+ // always returns a null value for the host.
+
+public:
+ HTTP_Parse_URL (const char *url = 0);
+ ~HTTP_Parse_URL (void);
+
+ void init (const char *url);
+
+ enum URL_SCHEME { HTTP, FTP };
+
+ const char *scheme (void) const;
+ const char *user (void) const;
+ const char *passwd (void) const;
+ const char *host (void) const;
+ int port (void) const;
+ const char *url_path (void) const;
+
+ enum URL_ERROR { NONE, STRDUP, SCHEME, SLASHSLASH };
+
+ int error (void) const { return( error_ ); }
+
+ int is_cgi (void) const;
+
+private:
+ void parse_url (void);
+ void parse_scheme (char *&p);
+ void parse_host (char *&p);
+ void parse_url_path (char *&p);
+ void is_cgi (const char *path);
+
+ void set_port_from_scheme (void);
+
+private:
+ char *url_;
+
+ char *scheme_;
+ char *user_;
+ char *passwd_;
+ char *host_;
+ int port_;
+ char *url_path_;
+
+ int error_;
+ int is_cgi_;
+};
+
+#endif /* !defined (HTTPU_HTTP_PARSE_H) */
diff --git a/apps/JAWS/PROTOTYPE/HTTP_10.cpp b/apps/JAWS/PROTOTYPE/HTTP_10.cpp
index 659c104343d..60ebdc8b17f 100644
--- a/apps/JAWS/PROTOTYPE/HTTP_10.cpp
+++ b/apps/JAWS/PROTOTYPE/HTTP_10.cpp
@@ -6,27 +6,6 @@
ACE_RCSID(PROTOTYPE, HTTP_10, "$Id$")
-JAWS_HTTP_10_Headers::JAWS_HTTP_10_Headers (void)
- : iter_ (*this)
-{
-}
-
-JAWS_HTTP_10_Headers::~JAWS_HTTP_10_Headers (void)
-{
-}
-
-int
-JAWS_HTTP_10_Headers::lessthan (const char *const &k1, const char *const &k2)
-{
- return ACE_OS::strcmp (k1, k2) < 0;
-}
-
-Symbol_Table_Iterator &
-JAWS_HTTP_10_Headers::iter (void)
-{
- return this->iter_;
-}
-
char *
JAWS_HTTP_10_Helper::HTTP_decode_string (char *path)
{
@@ -37,27 +16,17 @@ JAWS_HTTP_10_Helper::HTTP_decode_string (char *path)
for (i = j = 0; path[i] != '\0'; i++, j++)
{
if (path[i] == '%')
- {
- percentcode[0] = path[++i];
- percentcode[1] = path[++i];
- percentcode[2] = '\0';
- path[j] = (char) ACE_OS::strtol (percentcode, (char **) 0, 16);
- }
+ {
+ percentcode[0] = path[++i];
+ percentcode[1] = path[++i];
+ percentcode[2] = '\0';
+ path[j] = (char) ACE_OS::strtol (percentcode, (char **) 0, 16);
+ }
else
- path[j] = path[i];
+ path[j] = path[i];
}
path[j] = path[i];
return path;
}
-
-#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
-template class RB_Tree_Node<const char *, const char *>;
-template class RB_Tree<const char *, const char *>;
-template class RB_Tree_Iterator<const char *, const char *>;
-#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
-#pragma instantiate RB_Tree_Node<const char *, const char *>
-#pragma instantiate RB_Tree<const char *, const char *>
-#pragma instantiate RB_Tree_Iterator<const char *, const char *>
-#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/apps/JAWS/PROTOTYPE/HTTP_10.h b/apps/JAWS/PROTOTYPE/HTTP_10.h
index 8dcb2e00dd7..d5008b77918 100644
--- a/apps/JAWS/PROTOTYPE/HTTP_10.h
+++ b/apps/JAWS/PROTOTYPE/HTTP_10.h
@@ -34,13 +34,6 @@ public:
virtual int handle_put (JAWS_Data_Block *data, ACE_Time_Value *tv);
-private:
- int parse_request (JAWS_HTTP_10_Request *info, JAWS_Data_Block *data);
- int parse_headers (JAWS_HTTP_10_Request *info, ACE_Message_Block &mb);
- int parse_header_type (JAWS_HTTP_10_Request *info, ACE_Message_Block &mb);
- int parse_header_value (JAWS_HTTP_10_Request *info, ACE_Message_Block &mb);
- char * skipset (const char *set, char *start, char *end);
-
};
// Write the response
@@ -56,143 +49,7 @@ public:
private:
};
-typedef RB_Tree<const char *, const char *> Symbol_Table;
-typedef RB_Tree_Iterator<const char *, const char *> Symbol_Table_Iterator;
-
-class JAWS_HTTP_10_Headers : public Symbol_Table
-{
-public:
- JAWS_HTTP_10_Headers (void);
- virtual ~JAWS_HTTP_10_Headers (void);
-
- virtual int lessthan (const char *const &k1, const char *const &k2);
- // virtual comparison hook in RB_Tree
-
- Symbol_Table_Iterator &iter (void);
- // returns an iterator to the headers container
-
-private:
- Symbol_Table_Iterator iter_;
-};
-
-class JAWS_HTTP_10_Request
-{
-public:
- JAWS_HTTP_10_Request (void);
- ~JAWS_HTTP_10_Request (void);
-
- int end_of_line (void) const;
- void end_of_line (int flag);
-
- const char *last_header_type (void) const;
- void last_header_type (char *ht);
-
- const char *last_header_value (void) const;
- void last_header_value (char *hv);
-
- int last_header_length (void) const;
- void last_header_length (int len);
-
- char *header_buf (void);
-
- void append_last_header_value (char c);
- void reduce_last_header_value (void);
- void resize_last_header_value (void);
-
- void create_next_header_value (char *ht, char *hv);
-
- int reset (char *buffer, int buflen);
-
- void parse_request_line (char *request_line);
-
- int got_request_line (void) const;
- int end_of_headers (void) const;
- int status (void) const;
-
- const char *method (void) const;
- const char *uri (void) const;
- const char *version (void) const;
- const char *path (void) const;
-
- void got_request_line (int flag);
- void end_of_headers (int flag);
- void status (int s);
-
- JAWS_HTTP_10_Headers *table (void);
-
- const char *method (const char *s);
- const char *uri (const char *s);
- const char *version (const char *s);
- const char *path (const char *s);
-
- int type (void);
-
- enum REQUEST_TYPE
- {
- NO_TYPE = -1,
- GET = 0,
- HEAD,
- POST,
- PUT,
- QUIT,
- NUM_METHOD_STRINGS
- };
-
- enum STATUS_CODE
- {
- STATUS_OK = 200,
- STATUS_CREATED = 201,
- STATUS_ACCEPTED = 202,
- STATUS_NO_CONTENT = 204,
- STATUS_MOVED_PERMANENTLY = 301,
- STATUS_MOVED_TEMPORARILY = 302,
- STATUS_NOT_MODIFIED = 304,
- STATUS_INSUFFICIENT_DATA = 399,
- STATUS_BAD_REQUEST = 400,
- STATUS_UNAUTHORIZED = 401,
- STATUS_FORBIDDEN = 403,
- STATUS_NOT_FOUND = 404,
- STATUS_INTERNAL_SERVER_ERROR = 500,
- STATUS_NOT_IMPLEMENTED = 501,
- STATUS_BAD_GATEWAY = 502,
- STATUS_SERVICE_UNAVAILABLE = 503,
- STATUS_QUIT = 599
- };
-
- enum
- {
- MAX_STATUS_CODE = 599,
- MAX_HEADER_LENGTH = 8192
- };
- // Note that RFC 822 does not mention the maximum length of a header
- // line. So in theory, there is no maximum length.
- // In Apache, they assume that each header line should not exceed
- // 8K. Who am I to disagree?
-
-
-private:
- int got_request_line_;
- int end_of_headers_;
- int end_of_line_;
- char *last_header_type_;
- char *last_header_value_;
- int last_header_length_;
- int status_;
- int type_;
- int content_length_;
- int datalen_;
- int status_msglen_;
-
- char *data_;
- char *method_;
- char *uri_;
- char *version_;
- char *path_;
-
- char header_buf_[MAX_HEADER_LENGTH];
-
- JAWS_HTTP_10_Headers table_;
-};
+// Helpers
class JAWS_HTTP_10_Helper
// Static functions to enhance the lives of HTTP programmers everywhere.
diff --git a/apps/JAWS/PROTOTYPE/HTTP_10_Parse.cpp b/apps/JAWS/PROTOTYPE/HTTP_10_Parse.cpp
index de87d6ebfce..c0c04964776 100644
--- a/apps/JAWS/PROTOTYPE/HTTP_10_Parse.cpp
+++ b/apps/JAWS/PROTOTYPE/HTTP_10_Parse.cpp
@@ -7,6 +7,8 @@
#include "JAWS/IO_Handler.h"
#include "JAWS/Policy.h"
+#include "HTTP_10_Request.h"
+
ACE_RCSID(PROTOTYPE, HTTP_10_Parse, "$Id$")
// --------------- PARSE TASK ----------------------
@@ -46,10 +48,9 @@ cerr << "************* Message block in parse: " << data << endl;
data->payload (ACE_static_cast (void *, info));
}
- while (this->parse_request (info, data) == 0)
+ while (info->receive (*(ACE_Message_Block *)data) == 0)
{
- int next_read_size
- = JAWS_Data_Block::JAWS_DATA_BLOCK_SIZE - data->length ();
+ int next_read_size = data->space ();
if (next_read_size == 0)
{
@@ -73,293 +74,9 @@ cerr << "************* Message block in parse: " << data << endl;
}
}
- // request completely parsed
-
- return 0;
-}
-
-int
-JAWS_HTTP_10_Parse_Task::parse_request (JAWS_HTTP_10_Request *info,
- JAWS_Data_Block *data)
-{
- JAWS_TRACE ("JAWS_HTTP_10_Parse_Task::parse_request");
-
- // Algorithm --
- //
- // -- if we have not parsed a request line
- // scan for a newline
- // if no newline present, return
- // parse the request line
- // set "parsed request line" flag
- // set "end of line" flag
- // adjust the read pointer
- //
- // -- parse the header line input
- // loop:
- // if no more input break
- // if "end of line" flag is set and
- // line does not begin with leading white space
- // if this char is a newline
- // set "end of headers" flag
- // return
- // get the header type (i.e, up to colon)
- // if there is no colon
- // ignore input up to next newline or no more input
- // adjust the read pointer
- // goto loop:
- // set header value to something empty
- // set last header to point to current header
- // unset "end of line" flag
- // if "end of line" flag is not set or
- // if the line begins with leading white space,
- // while not a newline character present
- // if "end of input" end while
- // otherwise append char to last header value
- // adjust the read pointer
- // if a newline, set "end of line" flag
- // goto loop:
- //
- // -- adjust read and write pointer
- // if "end of input" occurs but there is still
-
- ACE_Message_Block &mb = *data;
-
- if (!info->got_request_line ())
- {
- char *p;
- p = this->skipset ("\n", mb.rd_ptr (), mb.wr_ptr ());
- if (p == mb.wr_ptr ())
- // can't do anything yet
- return 0;
-
- info->parse_request_line (mb.rd_ptr ());
-
- mb.rd_ptr (p+1);
- info->end_of_line (1);
- }
-
- return this->parse_headers (info, mb);
-}
-
-int
-JAWS_HTTP_10_Parse_Task::parse_headers (JAWS_HTTP_10_Request *info,
- ACE_Message_Block &mb)
-{
- JAWS_TRACE ("JAWS_HTTP_10_Parse_Task::parse_headers");
-
- for (;;)
- {
- if (mb.rd_ptr () == mb.wr_ptr ())
- break;
-
- char *p = mb.rd_ptr ();
-
- if (info->end_of_line ()
- && (*p != ' ' && *p != '\t'))
- {
- int r = this->parse_header_type (info, mb);
- if (r == 1)
- return info->end_of_headers ();
- continue;
- }
- else
- {
- int r = this->parse_header_value (info, mb);
- if (r == 1)
- break;
- continue;
- }
- }
-
- if (mb.rd_ptr () != mb.base ())
- {
- size_t len = mb.length ();
- if (len > 0)
- ACE_OS::memmove (mb.base (), mb.rd_ptr (), len);
- mb.rd_ptr (mb.base ());
- mb.wr_ptr (mb.base () + len);
- return 0;
- }
- else if (mb.length () == mb.size ())
- {
- // This is one of those cases that should rarely ever happen.
- // If we get here, it means the initial HTTP request line was
- // over 8K long or that the header type name is over 8K long.
- // In either case, we flag this as a bad request.
-
- // In HTTP/1.1, I have to remember that a bad request means the
- // connection needs to be closed and the client has to
- // reinitiate the connection.
-
- info->status (JAWS_HTTP_10_Request::STATUS_BAD_REQUEST);
- return 1;
- }
-
- return 0;
-}
-
-char *
-JAWS_HTTP_10_Parse_Task::skipset (const char *set, char *start, char *end)
-{
- char *p = start;
- while (p < end)
- {
- if (ACE_OS::strchr (set, *p) != NULL)
- break;
- p++;
- }
- return p;
-}
-
-int
-JAWS_HTTP_10_Parse_Task::parse_header_type (JAWS_HTTP_10_Request *info,
- ACE_Message_Block &mb)
-{
- JAWS_TRACE ("JAWS_HTTP_10_Parse_Task::parse_header_type");
+ cerr << "parse status: " << info->status () << endl;
- char *p = mb.rd_ptr ();
- char *q;
-
- q = this->skipset (":\n", p, mb.wr_ptr ());
- if (q == mb.wr_ptr ())
- // no more progress can be made until we find a ':'
- return 1;
- if (q == p)
- {
- // Ignore empty header type names
- info->create_next_header_value (0, 0);
- info->end_of_line (0);
- mb.rd_ptr (q+1);
- return 0;
- }
- if (*q == '\n')
- {
- // ignore this line
- mb.rd_ptr (q+1);
- if (q == p || ((q-1) == p && q[-1] == '\r'))
- {
- // blank line means end of headers
- info->create_next_header_value (0, 0);
- info->end_of_headers (1);
- if (mb.rd_ptr () == mb.wr_ptr ())
- {
- mb.rd_ptr (mb.base ());
- mb.wr_ptr (mb.base ());
- }
- return 1;
- }
-
- // not a blank line, but no ':', so ignore it
- info->create_next_header_value (0, 0);
- return 0;
- }
-
- // otherwise, we have a header type name!
- *q = '\0';
- char *header_type = ACE_OS::strdup (p);
- char *header_value = info->header_buf ();
-
- if (header_type == 0)
- {
- ACE_ERROR ((LM_ERROR,
- "%p\n",
- "JAWS_HTTP_10_Parse_Task::parse_request"));
- ACE_OS::free (header_type);
- header_type = 0;
- header_value = 0;
- info->create_next_header_value (header_type, header_value);
- }
- else
- {
- JAWS_TRACE ("JAWS_HTTP_10_Parse_Task::parse_header_type got one!");
-
- info->create_next_header_value (header_type, header_value);
- header_value[0] = '\0';
- info->table ()->insert (header_type, header_value);
- }
-
- info->end_of_line (0);
+ // request completely parsed
- mb.rd_ptr (q+1);
return 0;
}
-
-int
-JAWS_HTTP_10_Parse_Task::parse_header_value (JAWS_HTTP_10_Request *info,
- ACE_Message_Block &mb)
-{
- JAWS_TRACE ("JAWS_HTTP_10_Parse_Task::parse_header_value");
-
- // break --> return 1;
- // continue --> return 0;
-
- char *q = mb.rd_ptr ();
-
- if (info->last_header_value () == 0)
- {
- JAWS_TRACE ("JAWS_HTTP_10_Parse_Task::parse_header_value ignore");
-
- q = this->skipset ("\n", mb.rd_ptr (), mb.wr_ptr ());
- if (q == mb.wr_ptr ())
- {
- info->end_of_line (0);
- mb.rd_ptr (q);
- if (q[-1] == '\r')
- mb.rd_ptr (q-1);
- return 1;
- }
- if (*q == '\n')
- {
- info->end_of_line (1);
- q++;
- }
- mb.rd_ptr (q);
- return 0;
- }
- else
- {
- JAWS_TRACE ("JAWS_HTTP_10_Parse_Task::parse_header_value skip");
-
- // Skip over leading linear white space
- q = this->skipset (" \t", mb.rd_ptr (), mb.wr_ptr ());
- if (q == mb.wr_ptr ())
- {
- // need more input
- info->end_of_line (0);
- mb.rd_ptr (q);
- return 1;
- }
-
- // If not the first header value character,
- // insert a single space
- if (info->last_header_length () != 0)
- info->append_last_header_value (' ');
-
- while (q < mb.wr_ptr ())
- {
- if (*q == '\n')
- break;
- info->append_last_header_value (*q);
- q++;
- }
-
- if (q == mb.wr_ptr ())
- {
- info->end_of_line (0);
- mb.rd_ptr (q);
- return 1;
- }
-
- if (*q == '\n')
- {
- if (q[-1] == '\r')
- info->reduce_last_header_value ();
- info->end_of_line (1);
- mb.rd_ptr (q+1);
- return 0;
- }
- }
-
- // NOT REACHED
- return 1;
-}
diff --git a/apps/JAWS/PROTOTYPE/HTTP_10_Read.cpp b/apps/JAWS/PROTOTYPE/HTTP_10_Read.cpp
index 98518cc57ae..fe746512d14 100644
--- a/apps/JAWS/PROTOTYPE/HTTP_10_Read.cpp
+++ b/apps/JAWS/PROTOTYPE/HTTP_10_Read.cpp
@@ -32,9 +32,14 @@ JAWS_HTTP_10_Read_Task::handle_put (JAWS_Data_Block *data, ACE_Time_Value *)
if (data->length () > 0)
{
- JAWS_TRACE ("JAWS_HTTP_10_Read_Task::handle_put, have data");
- return 0;
+ if (data->rd_ptr ()[0] != '\0')
+ {
+ JAWS_TRACE ("JAWS_HTTP_10_Read_Task::handle_put, have data");
+ return 0;
+ }
}
+ data->rd_ptr (data->wr_ptr ());
+ data->crunch ();
io->read (handler, data, data->size ());
switch (handler->status ())
diff --git a/apps/JAWS/PROTOTYPE/HTTP_10_Request.cpp b/apps/JAWS/PROTOTYPE/HTTP_10_Request.cpp
index bfecf6071cd..7f839f550a9 100644
--- a/apps/JAWS/PROTOTYPE/HTTP_10_Request.cpp
+++ b/apps/JAWS/PROTOTYPE/HTTP_10_Request.cpp
@@ -1,213 +1,66 @@
// $Id$
#include "JAWS/JAWS.h"
-#include "HTTP_10.h"
+#include "HTTP_10_Request.h"
ACE_RCSID(PROTOTYPE, HTTP_10_Request, "$Id$")
-#define ACCESSOR(T,C,x) \
-T C##::##x (void) const { return this->##x##_; }\
-void C##::##x (T t) { this->##x##_ = t; }
-
+static int dummy;
JAWS_HTTP_10_Request::JAWS_HTTP_10_Request (void)
- : got_request_line_ (0),
- end_of_headers_ (0),
- end_of_line_ (0),
- last_header_type_ (0),
- last_header_value_ (0),
- last_header_length_ (0),
- status_ (0),
- type_ (-1),
- content_length_ (-1),
- datalen_ (0),
- status_msglen_ (0),
- data_ (0),
- method_ (0),
- uri_ (0),
- version_ (0),
- path_ (0)
+ : path_ (0)
{
}
JAWS_HTTP_10_Request::~JAWS_HTTP_10_Request (void)
{
- ACE_OS::free (this->method_);
- ACE_OS::free (this->uri_);
- ACE_OS::free (this->version_);
ACE_OS::free (this->path_);
-}
-
-int
-JAWS_HTTP_10_Request::reset (char *buffer, int buflen)
-{
- // Initialize these every time.
- this->content_length_ = -1;
-
- // Extract the data pointer.
- this->data_ = buffer;
- this->datalen_ = 0;
-
- // Set the datalen
- if (this->data_ != NULL)
- this->datalen_ = buflen;
- else
- this->datalen_ = 0;
-
- // ACE_DEBUG ((LM_DEBUG, " (%t) init has initialized\n"));
-
- return 1;
-}
-
-void
-JAWS_HTTP_10_Request::parse_request_line (char *request_line)
-{
- char *ptr = request_line;
- char *buf = request_line;
- int offset = 1;
-
- this->status_ = JAWS_HTTP_10_Request::STATUS_OK;
-
- ptr = ACE_OS::strchr (request_line, '\n');
-
- if (ptr > request_line && ptr[-1] == '\r')
- ptr--, offset++;
-
- if (ptr == request_line)
- {
- this->status_ = JAWS_HTTP_10_Request::STATUS_BAD_REQUEST;
- return;
- }
-
- *ptr = '\0';
- ptr += offset;
-
- char *lasts = 0; // for strtok_r
-
- // Get the request type.
- this->got_request_line_ = 1;
-
- if (this->method (ACE_OS::strtok_r (buf, " \t", &lasts))
- && this->uri (ACE_OS::strtok_r (NULL, " \t", &lasts)))
- {
- if (this->type () != NO_TYPE)
- {
- if (this->version (ACE_OS::strtok_r (NULL, " \t", &lasts)) == 0
- && this->type () != GET)
- this->status_ = STATUS_NOT_IMPLEMENTED;
-
- if (this->path (this->uri ()) == 0)
- this->status_ = STATUS_NOT_FOUND;
- }
- }
-}
-
-const char *
-JAWS_HTTP_10_Request::method (const char *method_string)
-{
- if (this->method_)
- ACE_OS::free (this->method_);
-
- if (method_string == 0)
- {
- this->status_ = STATUS_BAD_REQUEST;
- this->method_ = 0;
- }
- else
- this->method_ = ACE_OS::strdup (method_string);
-
- return this->method_;
-}
-
-const char *
-JAWS_HTTP_10_Request::uri (const char *uri_string)
-{
- if (this->uri_)
- ACE_OS::free (this->uri_);
-
- if (uri_string == 0)
- {
- this->status_ = STATUS_BAD_REQUEST;
- this->uri_ = 0;
- }
- else
- {
- this->uri_ = ACE_OS::strdup (uri_string);
- // this->cgi (this->uri_);
- JAWS_HTTP_10_Helper::HTTP_decode_string (this->uri_);
- }
-
- return this->uri_;
-}
-
-const char *
-JAWS_HTTP_10_Request::version (const char *version_string)
-{
- if (this->version_)
- ACE_OS::free (this->version_);
-
- if (version_string)
- this->version_ = ACE_OS::strdup (version_string);
- else
- this->version_ = 0;
-
- return this->version_;
+ this->path_ = 0;
}
const char *
JAWS_HTTP_10_Request::method (void) const
{
- return this->method_;
+ return this->request_line ()->method_str ();
}
const char *
JAWS_HTTP_10_Request::uri (void) const
{
- return this->uri_;
+ return this->request_line ()->url ();
}
const char *
JAWS_HTTP_10_Request::version (void) const
{
- return this->version_;
+ return this->request_line ()->version ();
}
-const char *
-JAWS_HTTP_10_Request::path (void) const
+int
+JAWS_HTTP_10_Request::type (void) const
{
- return this->path_;
+ return this->request_line ()->method ();
}
-int
-JAWS_HTTP_10_Request::type (void)
+const char *
+JAWS_HTTP_10_Request::path (void) const
{
- if (this->type_ == NO_TYPE && this->method () != 0)
+ if (this->path_ == 0)
{
- if (ACE_OS::strcmp (this->method (), "GET") == 0)
- this->type_ = GET;
- else if (ACE_OS::strcmp (this->method (), "HEAD") == 0)
- this->type_ = HEAD;
- else if (ACE_OS::strcmp (this->method (), "POST") == 0)
- this->type_ = POST;
- else if (ACE_OS::strcmp (this->method (), "PUT") == 0)
- this->type_ = PUT;
- else if (ACE_OS::strcmp (this->method (), "QUIT") == 0)
- this->type_ = QUIT;
- else
- this->status_ = STATUS_NOT_IMPLEMENTED;
+ JAWS_HTTP_10_Request *mutable_this = (JAWS_HTTP_10_Request *)this;
+ mutable_this->path (this->uri ());
}
-
- return this->type_;
+ return this->path_;
}
-const char *
+void
JAWS_HTTP_10_Request::path (const char *uri_string)
{
char const *file_name = uri_string;
char buf[MAXPATHLEN + 1];
buf[0] = '\0';
- if (file_name == 0) return 0;
+ if (file_name == 0) return;
if (*file_name == '/')
{
@@ -230,7 +83,7 @@ JAWS_HTTP_10_Request::path (const char *uri_string)
struct passwd pw_struct;
if (ACE_OS::getpwnam_r (buf, &pw_struct, pw_buf, sizeof (pw_buf))
== 0)
- return 0;
+ return;
ACE_OS::strcpy (buf, pw_struct.pw_dir);
#endif /* NOT ACE_WIN32 AND NOT VXWORKS */
}
@@ -257,93 +110,4 @@ JAWS_HTTP_10_Request::path (const char *uri_string)
if (*buf != '\0')
this->path_ = ACE_OS::strdup (buf);
-
- return this->path_;
-}
-
-JAWS_HTTP_10_Headers *
-JAWS_HTTP_10_Request::table (void)
-{
- return &(this->table_);
}
-
-void
-JAWS_HTTP_10_Request::append_last_header_value (char c)
-{
- if (this->last_header_value_ == 0)
- return;
-
- if (this->last_header_length_ < MAX_HEADER_LENGTH-1)
- {
- this->last_header_value_[this->last_header_length_] = c;
- this->last_header_length_++;
- this->last_header_value_[this->last_header_length_] = '\0';
- }
-}
-
-void
-JAWS_HTTP_10_Request::reduce_last_header_value (void)
-{
- if (this->last_header_value_ == 0) return;
-
- if (this->last_header_length_ > 0)
- {
- this->last_header_length_--;
- this->last_header_value_[this->last_header_length_] = '\0';
- }
-}
-
-void
-JAWS_HTTP_10_Request::resize_last_header_value (void)
-{
- if (this->last_header_value_ == 0)
- return;
- else {
- JAWS_TRACE ("JAWS_HTTP_10_Request::resize_last_header_value");
-
- char *nhv = ACE_OS::strdup (this->last_header_value_);
-
- if (nhv == 0)
- {
- ACE_ERROR ((LM_ERROR,
- "%p\n",
- "JAWS_HTTP_10_Request::resize_last_header_value"));
- this->table_.remove (this->last_header_type_);
- ACE_OS::free (this->last_header_type_);
- }
- else
- {
- const char **s = this->table_.find (this->last_header_type_);
- *s = nhv;
- }
-
- this->last_header_type_ = 0;
- this->last_header_value_ = 0;
- this->last_header_length_ = 0;
- }
-}
-
-void
-JAWS_HTTP_10_Request::create_next_header_value (char *ht, char *hv)
-{
- JAWS_TRACE ("JAWS_HTTP_10_Request::create_next_header_value");
-
- this->resize_last_header_value ();
- this->last_header_type (ht);
- this->last_header_value (hv);
- this->last_header_length (0);
-}
-
-char *
-JAWS_HTTP_10_Request::header_buf (void)
-{
- return this->header_buf_;
-}
-
-const ACCESSOR(char *,JAWS_HTTP_10_Request,last_header_type)
-const ACCESSOR(char *,JAWS_HTTP_10_Request,last_header_value)
-ACCESSOR(int,JAWS_HTTP_10_Request,last_header_length)
-ACCESSOR(int,JAWS_HTTP_10_Request,end_of_line)
-ACCESSOR(int,JAWS_HTTP_10_Request,got_request_line)
-ACCESSOR(int,JAWS_HTTP_10_Request,end_of_headers)
-ACCESSOR(int,JAWS_HTTP_10_Request,status)
diff --git a/apps/JAWS/PROTOTYPE/HTTP_10_Write.cpp b/apps/JAWS/PROTOTYPE/HTTP_10_Write.cpp
index 8279db64799..d0185aa337a 100644
--- a/apps/JAWS/PROTOTYPE/HTTP_10_Write.cpp
+++ b/apps/JAWS/PROTOTYPE/HTTP_10_Write.cpp
@@ -7,6 +7,8 @@
#include "HTTP_10.h"
+#include "HTTP_10_Request.h"
+
ACE_RCSID(PROTOTYPE, HTTP_10_Write, "$Id$")
// --------------- WRITE TASK ----------------------
@@ -24,6 +26,8 @@ JAWS_HTTP_10_Write_Task::handle_put (JAWS_Data_Block *data, ACE_Time_Value *)
{
JAWS_TRACE ("JAWS_HTTP_10_Write_Task::handle_put");
+ int status;
+
JAWS_IO_Handler *handler = data->io_handler ();
JAWS_Dispatch_Policy *policy = this->policy ();
if (policy == 0) policy = data->policy ();
@@ -38,36 +42,20 @@ JAWS_HTTP_10_Write_Task::handle_put (JAWS_Data_Block *data, ACE_Time_Value *)
(info->uri () ? info->uri () : "="),
(info->version () ? info->version () : "HTTP/0.9")));
-#if 0
- JAWS_HTTP_10_Headers *table = info->table ();
- Symbol_Table_Iterator &iter = table->iter ();
- for (iter.first (); ! iter.is_done (); iter.next ())
- {
- ACE_DEBUG ((LM_DEBUG, " (%t) header %s::%s\n",
- *(iter.key ()),
- *(iter.item ())));
- }
+ status = info->status ();
- char message[] = "<html><h1>This is a test</h1></html>\n";
+ if (info->type () != (int) JAWS_HTTP_10_Request::GET)
+ status = JAWS_HTTP_10_Request::STATUS_NOT_IMPLEMENTED;
- io->send_error_message (handler, message, sizeof (message));
- if (handler->status () == JAWS_IO_Handler::WRITE_OK)
- {
- return 0;
- }
+ if (info->type () == (int) JAWS_HTTP_10_Request::QUIT)
+ status = JAWS_HTTP_10_Request::STATUS_QUIT;
- return -1;
-#else
-
- if (info->type () != JAWS_HTTP_10_Request::GET)
- info->status (JAWS_HTTP_10_Request::STATUS_NOT_IMPLEMENTED);
-
- if (info->type () == JAWS_HTTP_10_Request::QUIT)
- info->status (JAWS_HTTP_10_Request::STATUS_QUIT);
-
- if (info->status () != JAWS_HTTP_10_Request::STATUS_OK)
+ if (status != (int) JAWS_HTTP_10_Request::STATUS_OK)
{
- char *msg =
+ JAWS_TRACE ("JAWS_HTTP_10_Write_Task::handle_put, ! STATUS OK");
+ cerr << "status: " << status << endl;
+
+ char msg[] =
"<html><head><title>HTTP/1.0 500 Internal Server Error</title>"
"<body><h1>Server Error</h1>HTTP/1.0 500 Internal Server Error"
"</body></html>";
@@ -75,18 +63,17 @@ JAWS_HTTP_10_Write_Task::handle_put (JAWS_Data_Block *data, ACE_Time_Value *)
io->send_error_message (handler, msg, sizeof (msg));
if (handler->status () == JAWS_IO_Handler::WRITE_OK)
{
- JAWS_HTTP_10_Headers *table = info->table ();
- Symbol_Table_Iterator &iter = table->iter ();
- for (iter.first (); ! iter.is_done (); iter.next ())
- {
- table->remove (*(iter.key ()));
- ACE_OS::free ((void *) *(iter.key ()));
- ACE_OS::free ((void *) *(iter.item ()));
- }
- int result = (info->status () == JAWS_HTTP_10_Request::STATUS_QUIT);
+ JAWS_TRACE ("JAWS_HTTP_10_Write_Task::handle_put, QUIT");
+ int result = (status
+ == (int) JAWS_HTTP_10_Request::STATUS_QUIT);
delete info;
return -result;
}
+ else
+ {
+ delete info;
+ return 1;
+ }
}
else
{
@@ -97,30 +84,29 @@ JAWS_HTTP_10_Write_Task::handle_put (JAWS_Data_Block *data, ACE_Time_Value *)
"",
0);
- JAWS_HTTP_10_Headers *table = info->table ();
- Symbol_Table_Iterator &iter = table->iter ();
- for (iter.first (); ! iter.is_done (); iter.next ())
- {
- table->remove (*(iter.key ()));
- ACE_OS::free ((void *) *(iter.key ()));
- ACE_OS::free ((void *) *(iter.item ()));
- }
-
switch (handler->status ())
{
case JAWS_IO_Handler::TRANSMIT_OK:
- delete info;
- return 0;
+ {
+ JAWS_TRACE ("JAWS_HTTP_10_Write_Task::handle_put, OK");
+ delete info;
+ return 0;
+ }
case JAWS_IO_Handler::TRANSMIT_ERROR:
- delete info;
- return -1;
+ {
+ JAWS_TRACE ("JAWS_HTTP_10_Write_Task::handle_put, ERROR");
+ delete info;
+ return -1;
+ }
default:
- delete info;
- return 1;
+ {
+ JAWS_TRACE ("JAWS_HTTP_10_Write_Task::handle_put, DEFAULT");
+ delete info;
+ return 1;
+ }
}
}
delete info;
return -1;
-#endif
}
diff --git a/apps/JAWS/PROTOTYPE/JAWS/Headers.cpp b/apps/JAWS/PROTOTYPE/JAWS/Headers.cpp
new file mode 100644
index 00000000000..b41ddd87ff5
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/JAWS/Headers.cpp
@@ -0,0 +1,165 @@
+/* $Id$ */
+
+#include "JAWS/Headers.h"
+
+// Header Data
+
+JAWS_Header_Data::JAWS_Header_Data (const char *name, const char *value,
+ int type)
+ : header_name_ (name ? ACE_OS::strdup (name) : 0),
+ header_value_ (value ? ACE_OS::strdup (value) : 0),
+ header_type_ (type)
+{
+}
+
+JAWS_Header_Data::JAWS_Header_Data (const char *name, int type,
+ const char *value)
+ : header_name_ (name ? ACE_OS::strdup (name) : 0),
+ header_value_ (value ? ACE_OS::strdup (value) : 0),
+ header_type_ (type)
+{
+}
+
+JAWS_Header_Data::~JAWS_Header_Data (void)
+{
+ if ( this->header_name_ )
+ ACE_OS::free ((void *)this->header_name_);
+ if ( this->header_value_ )
+ ACE_OS::free ((void *)this->header_value_);
+ this->header_name_ = 0;
+ this->header_value_ = 0;
+}
+
+const char *
+JAWS_Header_Data::header_name (void) const
+{
+ return this->header_name_;
+}
+
+const char *
+JAWS_Header_Data::header_value (void) const
+{
+ return this->header_value_;
+}
+
+int
+JAWS_Header_Data::header_type (void) const
+{
+ return this->header_type_;
+}
+
+void
+JAWS_Header_Data::header_name (const char *name)
+{
+ if (this->header_name_)
+ ACE_OS::free ((void *)this->header_name_);
+ this->header_name_ = name ? ACE_OS::strdup (name) : 0;
+}
+
+void
+JAWS_Header_Data::header_value (const char *value)
+{
+ if (this->header_value_)
+ ACE_OS::free ((void *)this->header_value_);
+ this->header_value_ = value ? ACE_OS::strdup (value) : 0;
+}
+
+void
+JAWS_Header_Data::header_type (int type)
+{
+ this->header_type_ = type;
+}
+
+
+// Header Table
+
+JAWS_Headers::JAWS_Headers (void)
+ : iter_ (*this)
+{
+}
+
+JAWS_Headers::~JAWS_Headers (void)
+{
+}
+
+JAWS_Header_Table_Iterator &
+JAWS_Headers::iter (void)
+{
+ return this->iter_;
+}
+
+int
+JAWS_Headers::insert (JAWS_Header_Data *new_data)
+{
+ // Since there may be duplicate header entries, we don't worry about
+ // doing this find anymore. Make the application developer figure
+ // out how to interpret duplicate entries.
+
+ return (JAWS_Header_Table::insert_tail (new_data) ? 0 : -1);
+}
+
+JAWS_Header_Data *
+JAWS_Headers::find (const char *const &header_name)
+{
+ this->iter_.first ();
+ return this->find_next (header_name);
+}
+
+JAWS_Header_Data *
+JAWS_Headers::find_next (const char *const &header_name)
+{
+ JAWS_Header_Data *data = 0;
+ JAWS_Header_Table_Iterator &i = this->iter_;
+
+ while (! i.done ())
+ {
+ data = i.next ();
+ if (data != 0)
+ {
+ if (ACE_OS::strcasecmp (data->header_name (), header_name) != 0)
+ data = 0;
+ }
+ i.advance ();
+ if (data != 0)
+ break;
+ }
+
+ return data;
+}
+
+void
+JAWS_Headers::remove_all (const char *const &header_name)
+{
+ JAWS_Header_Data *data;
+ int done;
+
+ do
+ {
+ JAWS_Header_Table_Iterator i (*this);
+ i.first ();
+ done = 1;
+ while (! i.done ())
+ {
+ data = i.next ();
+ if (data != 0
+ && ACE_OS::strcasecmp (data->header_name (), header_name) == 0)
+ {
+ i.remove ();
+ delete data;
+ done = 0;
+ break;
+ }
+ else
+ i.advance ();
+ }
+ }
+ while (! done);
+}
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+template class ACE_DLList<JAWS_Header_Data>;
+template class ACE_DLList_Iterator<JAWS_Header_Data>;
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+#pragma instantiate ACE_DLList<JAWS_Header_Data>
+#pragma instantiate ACE_DLList_Iterator<JAWS_Header_Data>
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/apps/JAWS/PROTOTYPE/JAWS/Headers.h b/apps/JAWS/PROTOTYPE/JAWS/Headers.h
new file mode 100644
index 00000000000..047cbddc3d7
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/JAWS/Headers.h
@@ -0,0 +1,73 @@
+/* -*- c++ -*- */
+// $Id$
+
+#if !defined (JAWS_HEADERS_H)
+#define JAWS_HEADERS_H
+
+#include "ace/Containers.h"
+
+// Use scenario --
+
+// Parse_Headers will parse out a header name and then will want to
+// update "last header data" in Header_Info. At this point, only the
+// header name is strdup'd.
+
+// Parse_Headers will then append additional data to the header value
+// until the header value of "last header data" is done.
+
+// Parse_Headers will notify Header_Info that "last header data" is
+// done and is ready to be inserted into the Headers data structure.
+// At this point, the header value is strdup'd.
+
+class JAWS_Header_Data
+{
+public:
+ JAWS_Header_Data (const char *name, const char *value = 0, int type = 0);
+ JAWS_Header_Data (const char *name, int type, const char *value = 0);
+ ~JAWS_Header_Data (void);
+
+ const char * header_name (void) const;
+ const char * header_value (void) const;
+ int header_type (void) const;
+
+ void header_name (const char *name);
+ void header_value (const char *value);
+ void header_type (int type);
+
+private:
+ const char * header_name_;
+ const char * header_value_;
+ int header_type_;
+};
+
+typedef ACE_DLList<JAWS_Header_Data> JAWS_Header_Table;
+typedef ACE_DLList_Iterator<JAWS_Header_Data> JAWS_Header_Table_Iterator;
+
+class JAWS_Headers : public JAWS_Header_Table
+{
+public:
+ JAWS_Headers (void);
+ ~JAWS_Headers (void);
+
+ int insert (JAWS_Header_Data *new_data);
+ // insert the new data 0 -> success, -1 -> failure
+
+ JAWS_Header_Data * find (const char *const &header_name);
+ // find always begins from the beginning of the list
+ // result is NULL if not found
+
+ JAWS_Header_Data * find_next (const char *const &header_name);
+ // behaves like find, but from where that last find left off
+ // result is NULL if not found
+
+ void remove_all (const char *const &header_name);
+ // remove all headers from list that match header_name
+
+ JAWS_Header_Table_Iterator &iter (void);
+ // returns an iterator to the headers container
+
+private:
+ JAWS_Header_Table_Iterator iter_;
+};
+
+#endif /* !defined (JAWS_HEADERS_H) */
diff --git a/apps/JAWS/PROTOTYPE/JAWS/IO.cpp b/apps/JAWS/PROTOTYPE/JAWS/IO.cpp
index 71a693d1c21..e5727c78181 100644
--- a/apps/JAWS/PROTOTYPE/JAWS/IO.cpp
+++ b/apps/JAWS/PROTOTYPE/JAWS/IO.cpp
@@ -241,7 +241,7 @@ JAWS_Asynch_IO::accept (JAWS_IO_Handler *ioh,
JAWS_TRACE ("JAWS_Asynch_IO::accept");
JAWS_Data_Block *db = ioh->message_block ();
- ACE_HANDLE listen_handle = db->policy ()->acceptor ()->get_handle ();
+ //ACE_HANDLE listen_handle = db->policy ()->acceptor ()->get_handle ();
//JAWS_Asynch_IO_Handler *aioh =
// ACE_dynamic_cast (JAWS_Asynch_IO_Handler *, ioh);
diff --git a/apps/JAWS/PROTOTYPE/JAWS/IO_Handler.cpp b/apps/JAWS/PROTOTYPE/JAWS/IO_Handler.cpp
index dd1e222ce11..47c3bd3b07a 100644
--- a/apps/JAWS/PROTOTYPE/JAWS/IO_Handler.cpp
+++ b/apps/JAWS/PROTOTYPE/JAWS/IO_Handler.cpp
@@ -221,28 +221,36 @@ void
JAWS_Asynch_Handler::open (ACE_HANDLE h,
ACE_Message_Block &mb)
{
+ JAWS_TRACE ("JAWS_Asynch_Handler::open");
+
// This currently does nothing, but just in case.
ACE_Service_Handler::open (h, mb);
// ioh_ set from the ACT hopefully
//this->dispatch_handler ();
+ this->handler ()->mb_->rd_ptr (this->handler ()->mb_->wr_ptr ());
this->handler ()->mb_->crunch ();
- if (mb.rd_ptr ()[0] != '\0')
- this->handler ()->mb_->copy (mb.rd_ptr (), mb.length ());
+
+ // Assume at this point there is no data.
+ //if (mb.rd_ptr ()[0] != '\0')
+ // this->handler ()->mb_->copy (mb.rd_ptr (), mb.length ());
ACE_Message_Block &mb2 = *(this->handler ()->mb_);
ACE_Asynch_Accept::Result fake_result
(*this, JAWS_IO_Asynch_Acceptor_Singleton::instance ()->get_handle (),
h, mb2, JAWS_Data_Block::JAWS_DATA_BLOCK_SIZE,
this->ioh_, ACE_INVALID_HANDLE);
-
+
this->handler ()->handler_ = this;
- this->handle_accept (fake_result);
+
+ fake_result.complete (0, 1, 0);
}
void
JAWS_Asynch_Handler::act (const void *act_ref)
{
+ JAWS_TRACE ("JAWS_Asynch_Handler::act");
+
// Set the ioh from the act
this->ioh_ = (JAWS_IO_Handler *) act_ref;
}
@@ -361,10 +369,14 @@ JAWS_Asynch_Handler::handle_transmit_file (const
void
JAWS_Asynch_Handler::handle_accept (const ACE_Asynch_Accept::Result &result)
{
+ JAWS_TRACE ("JAWS_Asynch_Handler::handle_accept");
this->dispatch_handler ();
if (result.success ())
- this->handler ()->accept_complete (result.accept_handle ());
+ {
+ JAWS_TRACE ("JAWS_Asynch_Handler::handle_accept, success");
+ this->handler ()->accept_complete (result.accept_handle ());
+ }
else
this->handler ()->accept_error ();
diff --git a/apps/JAWS/PROTOTYPE/JAWS/Makefile b/apps/JAWS/PROTOTYPE/JAWS/Makefile
index 30125c60226..f874017572e 100644
--- a/apps/JAWS/PROTOTYPE/JAWS/Makefile
+++ b/apps/JAWS/PROTOTYPE/JAWS/Makefile
@@ -14,6 +14,8 @@ LIB = libJAWS.a
SHLIB = libJAWS.$(SOEXT)
MYFILES = \
+ Headers \
+ Parse_Headers \
Waiter \
Reaper \
Pipeline \
diff --git a/apps/JAWS/PROTOTYPE/JAWS/Parse_Headers.cpp b/apps/JAWS/PROTOTYPE/JAWS/Parse_Headers.cpp
new file mode 100644
index 00000000000..21aaba59b64
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/JAWS/Parse_Headers.cpp
@@ -0,0 +1,418 @@
+// $Id$
+
+#include "JAWS/Parse_Headers.h"
+
+#define ACCESSOR(T,C,x) \
+T C##::##x (void) const { return this->##x##_; }\
+void C##::##x (T t) { this->##x##_ = t; }
+
+int
+JAWS_Parse_Headers::parse_headers (JAWS_Header_Info *info,
+ ACE_Message_Block &mb)
+{
+ for (;;)
+ {
+ if (mb.rd_ptr () == mb.wr_ptr ())
+ break;
+
+ char *p = mb.rd_ptr ();
+
+ if (info->end_of_line ()
+ && (*p != ' ' && *p != '\t'))
+ {
+ int r = this->parse_header_name (info, mb);
+ if (r == 1)
+ return info->end_of_headers ();
+ continue;
+ }
+ else
+ {
+ int r = this->parse_header_value (info, mb);
+ if (r == 1)
+ break;
+ continue;
+ }
+ }
+
+ // If we arrive here, it means either there is nothing more to read,
+ // or parse_header_value ran into difficulties (like maybe the
+ // header value was too long).
+
+ if (mb.rd_ptr () != mb.base ())
+ {
+ mb.crunch ();
+ return 0;
+ }
+ else if (mb.length () == mb.size ())
+ {
+ // This is one of those cases that should rarely ever happen.
+ // If we get here, the header type name is over 8K long. We
+ // flag this as a bad thing.
+
+ // In HTTP/1.1, I have to remember that a bad request means the
+ // connection needs to be closed and the client has to
+ // reinitiate the connection.
+
+ info->status (JAWS_Header_Info::TOO_LONG);
+ return 1;
+ }
+
+ ACE_DEBUG ((LM_DEBUG, "JAWS_Parse_Headers -- shouldn't be here!\n"));
+ return 1;
+}
+
+char *
+JAWS_Parse_Headers::skipset (const char *set, char *start, char *end)
+{
+ char *p = start;
+ while (p < end)
+ {
+ if (ACE_OS::strchr (set, *p) != NULL)
+ break;
+ p++;
+ }
+ return p;
+}
+
+char *
+JAWS_Parse_Headers::skipcset (const char *set, char *start, char *end)
+{
+ char *p = start;
+ while (p < end)
+ {
+ if (ACE_OS::strchr (set, *p) == NULL)
+ break;
+ p++;
+ }
+ return p;
+}
+
+int
+JAWS_Parse_Headers::parse_header_name (JAWS_Header_Info *info,
+ ACE_Message_Block &mb)
+{
+ char *p = mb.rd_ptr ();
+ char *q;
+
+ q = this->skipset (":\n", p, mb.wr_ptr ());
+ if (q == mb.wr_ptr ())
+ {
+ // no more progress can be made until we find a ':'
+ return 1;
+ }
+ if (*q != '\n' && q == p)
+ {
+ // Ignore empty header type names
+ info->finish_last_header_value ();
+ info->create_next_header_value (0);
+ info->end_of_line (0);
+ mb.rd_ptr (q+1);
+ return 0;
+ }
+ if (*q == '\n')
+ {
+ // ignore this line
+ mb.rd_ptr (q+1);
+ if (q == p || ((q-1) == p && q[-1] == '\r'))
+ {
+ // blank line means end of headers
+ info->finish_last_header_value ();
+ info->create_next_header_value (0);
+ info->end_of_headers (1);
+ if (mb.rd_ptr () == mb.wr_ptr ())
+ mb.crunch ();
+ return 1;
+ }
+
+ // not a blank line, but no ':', so ignore it
+ info->finish_last_header_value ();
+ info->create_next_header_value (0);
+ return 0;
+ }
+
+ // otherwise, we have a header type name!
+ *q = '\0';
+ info->create_next_header_value (p);
+ info->end_of_line (0);
+
+ mb.rd_ptr (q+1);
+ return 0;
+}
+
+int
+JAWS_Parse_Headers::parse_header_value (JAWS_Header_Info *info,
+ ACE_Message_Block &mb)
+{
+ // break --> return 1;
+ // continue --> return 0;
+
+ char *q = mb.rd_ptr ();
+
+ if (info->last_header_data () == 0)
+ {
+ // Ignoring this header (it is too long or something).
+
+ q = this->skipset ("\n", mb.rd_ptr (), mb.wr_ptr ());
+ if (q == mb.wr_ptr ())
+ {
+ info->end_of_line (0);
+ mb.rd_ptr (q);
+
+ // Move the rd_ptr back one character if the last thing we
+ // see is a carriage return. Assert: wr_ptr > rd_ptr.
+ if (q[-1] == '\r')
+ mb.rd_ptr (q-1);
+
+ return 1;
+ }
+
+ // Move past the newline, set the end of line flag
+ if (*q == '\n')
+ {
+ info->end_of_line (1);
+ q++;
+ }
+ mb.rd_ptr (q);
+
+ return 0;
+ }
+ else
+ {
+ if (info->end_of_line ())
+ {
+ // Skip over leading linear white space
+ q = this->skipcset (" \t", mb.rd_ptr (), mb.wr_ptr ());
+ if (q == mb.wr_ptr ())
+ {
+ // need more input
+ info->end_of_line (1);
+ mb.rd_ptr (q-1);
+ return 1;
+ }
+
+ if (*q != '\n')
+ info->append_last_header_value (' ');
+ }
+
+ // Append to last header value character by character
+ while (q < mb.wr_ptr ())
+ {
+ if (*q == '\n')
+ break;
+ info->append_last_header_value (*q);
+ q++;
+ }
+
+ // Need more input
+ if (q == mb.wr_ptr ())
+ {
+ mb.rd_ptr (q);
+ info->end_of_line (0);
+ return 1;
+ }
+
+ // Reached a newline
+ if (*q == '\n')
+ {
+ // Reduce by one character if line discipline is "\r\n"
+ if (info->append_last_header_value () == '\r')
+ info->reduce_last_header_value ();
+
+ // Move past newline, set end of line flag
+ mb.rd_ptr (q+1);
+ info->end_of_line (1);
+
+ return 0;
+ }
+ }
+
+ // NOT REACHED
+ return 1;
+}
+
+
+JAWS_Header_Info::JAWS_Header_Info (void)
+ : end_of_headers_ (0),
+ end_of_line_ (1),
+ last_header_data_ (0),
+ last_header_length_ (0),
+ status_ (0)
+{
+}
+
+JAWS_Header_Info::~JAWS_Header_Info (void)
+{
+ JAWS_Header_Table_Iterator iter (this->table_);
+ JAWS_Header_Data *data_ptr;
+
+ for (iter.first (); !iter.done (); iter.advance ())
+ {
+ data_ptr = iter.next ();
+ if (data_ptr)
+ delete data_ptr;
+ }
+}
+
+void
+JAWS_Header_Info::dump (void)
+{
+ JAWS_Header_Table_Iterator iter (this->table_);
+
+ ACE_DEBUG ((LM_DEBUG, "== BEGIN HEADER INFO DUMP ==\n"));
+ for (iter.first (); ! iter.done (); iter.advance ())
+ {
+ JAWS_Header_Data *data;
+ data = iter.next ();
+ if (data != 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "%s -- %s\n",
+ data->header_name (), data->header_value ()));
+ else
+ ACE_DEBUG ((LM_DEBUG, "NULL ENTRY\n"));
+ }
+ ACE_DEBUG ((LM_DEBUG, "== END HEADER INFO DUMP ==\n"));
+}
+
+JAWS_Headers *
+JAWS_Header_Info::table (void)
+{
+ return &(this->table_);
+}
+
+void
+JAWS_Header_Info::append_last_header_value (char c)
+{
+ if (this->last_header_data_ == 0)
+ return;
+
+ if (this->last_header_length_ == 0 && (c == ' ' || c == '\t'))
+ return;
+
+ if (this->last_header_length_ < MAX_HEADER_LENGTH-1)
+ {
+ this->header_buf_[this->last_header_length_] = c;
+ this->last_header_length_++;
+ this->header_buf_[this->last_header_length_] = '\0';
+ }
+
+}
+
+int
+JAWS_Header_Info::append_last_header_value (void)
+{
+ if (this->last_header_data_ == 0 || this->last_header_length_ == 0)
+ return -1;
+
+ return this->header_buf_[this->last_header_length_-1];
+}
+
+void
+JAWS_Header_Info::append_last_header_value (const char *begin, const char *end)
+{
+ if (this->last_header_data_ == 0)
+ return;
+
+ while (this->last_header_length_ < MAX_HEADER_LENGTH-1)
+ {
+ if (begin == end)
+ break;
+
+ this->header_buf_[this->last_header_length_] = *begin;
+ this->last_header_length_++;
+ begin++;
+ }
+
+ this->header_buf_[this->last_header_length_] = '\0';
+}
+
+void
+JAWS_Header_Info::reduce_last_header_value (void)
+{
+ if (this->last_header_data_ == 0) return;
+
+ if (this->last_header_length_ > 0)
+ {
+ this->last_header_length_--;
+ this->header_buf_[this->last_header_length_] = '\0';
+ }
+}
+
+void
+JAWS_Header_Info::create_next_header_value (char *ht)
+{
+ if (ht == 0)
+ {
+ // discard last header data
+
+ delete this->last_header_data_;
+ this->last_header_data_ = 0;
+ this->last_header_length (0);
+ return;
+ }
+
+ this->finish_last_header_value ();
+
+ if (this->status () == JAWS_Header_Info::OK)
+ {
+ // create a new last_header_data_ node
+
+ this->last_header_data_ = new JAWS_Header_Data (ht, 0);
+ // The above performs a strdup.
+
+ if (this->last_header_data_ == 0 || this->last_header_name () == 0)
+ {
+ this->status (JAWS_Header_Info::NO_MEMORY);
+ delete this->last_header_data_;
+ this->last_header_data_ = 0;
+ }
+ this->last_header_length (0);
+ this->header_buf_[0] = '\0';
+ }
+}
+
+void
+JAWS_Header_Info::finish_last_header_value (void)
+{
+ if (this->last_header_data_ != 0)
+ {
+ // prepare to insert last header data into the table.
+
+ this->last_header_data_->header_value (this->header_buf ());
+ // The above performs a strdup.
+
+ if (this->status () == JAWS_Header_Info::OK)
+ this->table_.insert (this->last_header_data_);
+ else
+ delete this->last_header_data_;
+ this->last_header_data_ = 0;
+ }
+}
+
+char *
+JAWS_Header_Info::header_buf (void)
+{
+ return this->header_buf_;
+}
+
+const char *
+JAWS_Header_Info::last_header_name (void) const
+{
+ return this->last_header_data_ ? this->last_header_data_->header_name () : 0;
+}
+
+const JAWS_Header_Data *
+JAWS_Header_Info::last_header_data (void) const
+{
+ return this->last_header_data_;
+}
+
+ACCESSOR(int,JAWS_Header_Info,last_header_length)
+ACCESSOR(int,JAWS_Header_Info,end_of_line)
+ACCESSOR(int,JAWS_Header_Info,end_of_headers)
+ACCESSOR(int,JAWS_Header_Info,status)
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+ template class ACE_Singleton<JAWS_Parse_Headers, ACE_SYNCH_MUTEX>;
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+# pragma instantiate ACE_Singleton<JAWS_Parse_Headers, ACE_SYNCH_MUTEX>
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/apps/JAWS/PROTOTYPE/JAWS/Parse_Headers.h b/apps/JAWS/PROTOTYPE/JAWS/Parse_Headers.h
new file mode 100644
index 00000000000..49118f61fc3
--- /dev/null
+++ b/apps/JAWS/PROTOTYPE/JAWS/Parse_Headers.h
@@ -0,0 +1,116 @@
+/* -*- c++ -*- */
+// $Id$
+
+#if !defined (JAWS_PARSE_HEADERS_H)
+#define JAWS_PARSE_HEADERS_H
+
+#include "ace/Singleton.h"
+#include "ace/Message_Block.h"
+
+#include "Headers.h"
+
+class JAWS_Header_Info
+{
+public:
+ JAWS_Header_Info (void);
+ ~JAWS_Header_Info (void);
+
+ int end_of_line (void) const;
+ void end_of_line (int flag);
+
+ const char *last_header_name (void) const;
+
+ int last_header_length (void) const;
+ void last_header_length (int len);
+
+ const JAWS_Header_Data * last_header_data (void) const;
+
+ char *header_buf (void);
+
+ void append_last_header_value (char c);
+ int append_last_header_value (void);
+ void append_last_header_value (const char *begin, const char *end);
+ void reduce_last_header_value (void);
+
+ void create_next_header_value (char *ht);
+ // This will insert last_header_data into the table if it is not
+ // null. Then, it will create a new header_data node and populate
+ // it. If ht is null, last_header_data is not inserted.
+
+ void finish_last_header_value (void);
+ // This will insert last_header_data into the table if it is not
+ // null.
+
+ int end_of_headers (void) const;
+ void end_of_headers (int flag);
+
+ int status (void) const;
+ void status (int s);
+
+ JAWS_Headers *table (void);
+
+ enum STATUS_CODE
+ {
+ OK = 0,
+ NO_MEMORY,
+ TOO_LONG
+ };
+
+ enum
+ {
+ MAX_HEADER_LENGTH = 8192
+ };
+ // Note that RFC 822 does not mention the maximum length of a header
+ // line. So in theory, there is no maximum length.
+ // In Apache, they assume that each header line should not exceed
+ // 8K. Who am I to disagree?
+
+ void dump (void);
+
+private:
+ int end_of_headers_;
+ int end_of_line_;
+
+ JAWS_Header_Data *last_header_data_;
+
+ int last_header_length_;
+ int status_;
+
+ char header_buf_[MAX_HEADER_LENGTH];
+ JAWS_Headers table_;
+};
+
+class JAWS_Parse_Headers
+{
+public:
+
+ int parse_headers (JAWS_Header_Info *info, ACE_Message_Block &mb);
+ // Return 0 means need more data, and call it again.
+ // Return 1 means all done or error.
+
+ int parse_header_name (JAWS_Header_Info *info, ACE_Message_Block &mb);
+ // Return 0 means reiterate on remaining input.
+ // Return 1 means input has ended (either because it ended
+ // prematurely, or that there are no more headers).
+
+ int parse_header_value (JAWS_Header_Info *info, ACE_Message_Block &mb);
+ // Return 0 means reiterate on remaining input.
+ // Return 1 means input has ended or that an error has occurred.
+
+ char * skipset (const char *set, char *start, char *end);
+ // Scans from start to end for characters that match skip set.
+ // Returns pointer to first location between start and end of a
+ // character that is in the skip set.
+
+ char * skipcset (const char *set, char *start, char *end);
+ // Scans from start to end for characters that match skip set.
+ // Returns pointer to first location between start and end of a
+ // character that is *not* in the skip set.
+
+};
+
+typedef ACE_Singleton<JAWS_Parse_Headers, ACE_SYNCH_MUTEX>
+ JAWS_Parse_Headers_Singleton;
+
+
+#endif /* !defined (JAWS_PARSE_HEADERS_H) */
diff --git a/apps/JAWS/PROTOTYPE/Makefile b/apps/JAWS/PROTOTYPE/Makefile
index 63d11c96c29..8ae0e628aa4 100644
--- a/apps/JAWS/PROTOTYPE/Makefile
+++ b/apps/JAWS/PROTOTYPE/Makefile
@@ -20,7 +20,7 @@ SRC = $(addsuffix .cpp,$(FILES))
OBJ = $(addsuffix .o,$(FILES))
LDFLAGS += -L./JAWS
-LDLIBS = -lJAWS
+LDLIBS = -lHTTPU -lJAWS
BUILD = $(VBIN)
@@ -46,10 +46,8 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
# DO NOT DELETE THIS LINE -- g++dep uses it.
# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
-.obj/HTTP_10.o .obj/HTTP_10.so .shobj/HTTP_10.o .shobj/HTTP_10.so: HTTP_10.cpp HTTP_10.h \
- $(ACE_ROOT)/ace/RB_Tree.h \
- $(ACE_ROOT)/ace/ACE.h \
- $(ACE_ROOT)/ace/OS.h \
+.obj/HTTP_10.o .obj/HTTP_10.so .shobj/HTTP_10.o .shobj/HTTP_10.so: HTTP_10.cpp HTTP_10.h $(ACE_ROOT)/ace/RB_Tree.h \
+ $(ACE_ROOT)/ace/ACE.h $(ACE_ROOT)/ace/OS.h \
$(ACE_ROOT)/ace/inc_user_config.h \
$(ACE_ROOT)/ace/config.h \
$(ACE_ROOT)/ace/config-sunos5.5.h \
@@ -57,8 +55,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/streams.h \
$(ACE_ROOT)/ace/Basic_Types.h \
$(ACE_ROOT)/ace/Basic_Types.i \
- $(ACE_ROOT)/ace/OS.i \
- $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i $(ACE_ROOT)/ace/Trace.h \
$(ACE_ROOT)/ace/Log_Msg.h \
$(ACE_ROOT)/ace/Log_Record.h \
$(ACE_ROOT)/ace/ACE.i \
@@ -72,13 +69,11 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
$(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
$(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
- $(ACE_ROOT)/ace/Synch.i \
- $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Synch.i $(ACE_ROOT)/ace/Synch_T.h \
$(ACE_ROOT)/ace/Event_Handler.h \
$(ACE_ROOT)/ace/Event_Handler.i \
$(ACE_ROOT)/ace/Synch_T.i \
- $(ACE_ROOT)/ace/Thread.h \
- $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Thread.h $(ACE_ROOT)/ace/Thread.i \
$(ACE_ROOT)/ace/Atomic_Op.i \
$(ACE_ROOT)/ace/Synch_T.cpp \
$(ACE_ROOT)/ace/Singleton.i \
@@ -87,8 +82,8 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Object_Manager.i \
$(ACE_ROOT)/ace/Managed_Object.h \
$(ACE_ROOT)/ace/Managed_Object.i \
- $(ACE_ROOT)/ace/Managed_Object.cpp JAWS/Pipeline.h \
- $(ACE_ROOT)/ace/Service_Config.h \
+ $(ACE_ROOT)/ace/Managed_Object.cpp JAWS/Export.h \
+ JAWS/Pipeline.h $(ACE_ROOT)/ace/Service_Config.h \
$(ACE_ROOT)/ace/Service_Object.h \
$(ACE_ROOT)/ace/Shared_Object.h \
$(ACE_ROOT)/ace/Shared_Object.i \
@@ -96,8 +91,11 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Signal.h \
$(ACE_ROOT)/ace/Containers.h \
$(ACE_ROOT)/ace/Containers.i \
- $(ACE_ROOT)/ace/Containers.cpp \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
$(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
$(ACE_ROOT)/ace/Malloc.i \
$(ACE_ROOT)/ace/Malloc_T.h \
$(ACE_ROOT)/ace/Free_List.h \
@@ -128,13 +126,17 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Message_Block.h \
$(ACE_ROOT)/ace/Message_Block.i \
$(ACE_ROOT)/ace/Time_Value.h \
- $(ACE_ROOT)/ace/Module.h \
- $(ACE_ROOT)/ace/Task_T.h \
+ $(ACE_ROOT)/ace/Module.h $(ACE_ROOT)/ace/Task_T.h \
$(ACE_ROOT)/ace/Message_Queue.h \
+ $(ACE_ROOT)/ace/Message_Queue_T.h \
+ $(ACE_ROOT)/ace/Message_Queue_T.i \
+ $(ACE_ROOT)/ace/Message_Queue_T.cpp \
$(ACE_ROOT)/ace/Strategies.h \
$(ACE_ROOT)/ace/Strategies_T.h \
$(ACE_ROOT)/ace/Synch_Options.h \
$(ACE_ROOT)/ace/Synch_Options.i \
+ $(ACE_ROOT)/ace/Thread_Manager.h \
+ $(ACE_ROOT)/ace/Thread_Manager.i \
$(ACE_ROOT)/ace/Hash_Map_Manager.h \
$(ACE_ROOT)/ace/Hash_Map_Manager.cpp \
$(ACE_ROOT)/ace/Strategies_T.i \
@@ -143,15 +145,11 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Service_Types.h \
$(ACE_ROOT)/ace/Service_Types.i \
$(ACE_ROOT)/ace/Service_Repository.i \
- $(ACE_ROOT)/ace/Thread_Manager.h \
- $(ACE_ROOT)/ace/Thread_Manager.i \
$(ACE_ROOT)/ace/WFMO_Reactor.h \
$(ACE_ROOT)/ace/WFMO_Reactor.i \
$(ACE_ROOT)/ace/Strategies.i \
$(ACE_ROOT)/ace/Message_Queue.i \
- $(ACE_ROOT)/ace/Message_Queue.cpp \
- $(ACE_ROOT)/ace/Task.h \
- $(ACE_ROOT)/ace/Task.i \
+ $(ACE_ROOT)/ace/Task.h $(ACE_ROOT)/ace/Task.i \
$(ACE_ROOT)/ace/Task_T.i \
$(ACE_ROOT)/ace/Task_T.cpp \
$(ACE_ROOT)/ace/Module.i \
@@ -162,10 +160,9 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Stream.i \
$(ACE_ROOT)/ace/Stream.cpp JAWS/Pipeline_Handler.h \
JAWS/Pipeline_Handler.cpp JAWS/Data_Block.h JAWS/JAWS.h
-.obj/HTTP_10_Request.o .obj/HTTP_10_Request.so .shobj/HTTP_10_Request.o .shobj/HTTP_10_Request.so: HTTP_10_Request.cpp HTTP_10.h \
- $(ACE_ROOT)/ace/RB_Tree.h \
- $(ACE_ROOT)/ace/ACE.h \
- $(ACE_ROOT)/ace/OS.h \
+.obj/HTTP_10_Request.o .obj/HTTP_10_Request.so .shobj/HTTP_10_Request.o .shobj/HTTP_10_Request.so: HTTP_10_Request.cpp JAWS/JAWS.h HTTP_10_Request.h \
+ HTTPU/http_request.h $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/ACE.h $(ACE_ROOT)/ace/OS.h \
$(ACE_ROOT)/ace/inc_user_config.h \
$(ACE_ROOT)/ace/config.h \
$(ACE_ROOT)/ace/config-sunos5.5.h \
@@ -173,114 +170,60 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/streams.h \
$(ACE_ROOT)/ace/Basic_Types.h \
$(ACE_ROOT)/ace/Basic_Types.i \
- $(ACE_ROOT)/ace/OS.i \
- $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i $(ACE_ROOT)/ace/Trace.h \
$(ACE_ROOT)/ace/Log_Msg.h \
$(ACE_ROOT)/ace/Log_Record.h \
$(ACE_ROOT)/ace/ACE.i \
$(ACE_ROOT)/ace/Log_Priority.h \
$(ACE_ROOT)/ace/Log_Record.i \
- $(ACE_ROOT)/ace/RB_Tree.i \
- $(ACE_ROOT)/ace/RB_Tree.cpp JAWS/Pipeline_Tasks.h \
- $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
$(ACE_ROOT)/ace/Synch.h \
$(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
$(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
$(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
$(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
- $(ACE_ROOT)/ace/Synch.i \
- $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Synch.i $(ACE_ROOT)/ace/Synch_T.h \
$(ACE_ROOT)/ace/Event_Handler.h \
$(ACE_ROOT)/ace/Event_Handler.i \
$(ACE_ROOT)/ace/Synch_T.i \
- $(ACE_ROOT)/ace/Thread.h \
- $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Thread.h $(ACE_ROOT)/ace/Thread.i \
$(ACE_ROOT)/ace/Atomic_Op.i \
$(ACE_ROOT)/ace/Synch_T.cpp \
- $(ACE_ROOT)/ace/Singleton.i \
- $(ACE_ROOT)/ace/Singleton.cpp \
- $(ACE_ROOT)/ace/Object_Manager.h \
- $(ACE_ROOT)/ace/Object_Manager.i \
- $(ACE_ROOT)/ace/Managed_Object.h \
- $(ACE_ROOT)/ace/Managed_Object.i \
- $(ACE_ROOT)/ace/Managed_Object.cpp JAWS/Pipeline.h \
- $(ACE_ROOT)/ace/Service_Config.h \
- $(ACE_ROOT)/ace/Service_Object.h \
- $(ACE_ROOT)/ace/Shared_Object.h \
- $(ACE_ROOT)/ace/Shared_Object.i \
- $(ACE_ROOT)/ace/Service_Object.i \
- $(ACE_ROOT)/ace/Signal.h \
- $(ACE_ROOT)/ace/Containers.h \
- $(ACE_ROOT)/ace/Containers.i \
- $(ACE_ROOT)/ace/Containers.cpp \
- $(ACE_ROOT)/ace/Malloc.h \
- $(ACE_ROOT)/ace/Malloc.i \
- $(ACE_ROOT)/ace/Malloc_T.h \
$(ACE_ROOT)/ace/Free_List.h \
$(ACE_ROOT)/ace/Free_List.i \
$(ACE_ROOT)/ace/Free_List.cpp \
$(ACE_ROOT)/ace/Malloc_T.i \
$(ACE_ROOT)/ace/Malloc_T.cpp \
$(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp \
$(ACE_ROOT)/ace/Mem_Map.h \
$(ACE_ROOT)/ace/Mem_Map.i \
$(ACE_ROOT)/ace/Memory_Pool.i \
- $(ACE_ROOT)/ace/Signal.i \
- $(ACE_ROOT)/ace/SString.h \
- $(ACE_ROOT)/ace/SString.i \
- $(ACE_ROOT)/ace/Service_Config.i \
- $(ACE_ROOT)/ace/Reactor.h \
- $(ACE_ROOT)/ace/Handle_Set.h \
- $(ACE_ROOT)/ace/Handle_Set.i \
- $(ACE_ROOT)/ace/Timer_Queue.h \
- $(ACE_ROOT)/ace/Timer_Queue_T.h \
- $(ACE_ROOT)/ace/Timer_Queue_T.i \
- $(ACE_ROOT)/ace/Timer_Queue_T.cpp \
- $(ACE_ROOT)/ace/Reactor.i \
- $(ACE_ROOT)/ace/Reactor_Impl.h \
- $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \
- $(ACE_ROOT)/ace/Stream.h \
- $(ACE_ROOT)/ace/IO_Cntl_Msg.h \
- $(ACE_ROOT)/ace/Message_Block.h \
- $(ACE_ROOT)/ace/Message_Block.i \
- $(ACE_ROOT)/ace/Time_Value.h \
- $(ACE_ROOT)/ace/Module.h \
- $(ACE_ROOT)/ace/Task_T.h \
- $(ACE_ROOT)/ace/Message_Queue.h \
- $(ACE_ROOT)/ace/Strategies.h \
- $(ACE_ROOT)/ace/Strategies_T.h \
- $(ACE_ROOT)/ace/Synch_Options.h \
- $(ACE_ROOT)/ace/Synch_Options.i \
- $(ACE_ROOT)/ace/Hash_Map_Manager.h \
- $(ACE_ROOT)/ace/Hash_Map_Manager.cpp \
- $(ACE_ROOT)/ace/Strategies_T.i \
- $(ACE_ROOT)/ace/Strategies_T.cpp \
- $(ACE_ROOT)/ace/Service_Repository.h \
- $(ACE_ROOT)/ace/Service_Types.h \
- $(ACE_ROOT)/ace/Service_Types.i \
- $(ACE_ROOT)/ace/Service_Repository.i \
- $(ACE_ROOT)/ace/Thread_Manager.h \
- $(ACE_ROOT)/ace/Thread_Manager.i \
- $(ACE_ROOT)/ace/WFMO_Reactor.h \
- $(ACE_ROOT)/ace/WFMO_Reactor.i \
- $(ACE_ROOT)/ace/Strategies.i \
- $(ACE_ROOT)/ace/Message_Queue.i \
- $(ACE_ROOT)/ace/Message_Queue.cpp \
- $(ACE_ROOT)/ace/Task.h \
- $(ACE_ROOT)/ace/Task.i \
- $(ACE_ROOT)/ace/Task_T.i \
- $(ACE_ROOT)/ace/Task_T.cpp \
- $(ACE_ROOT)/ace/Module.i \
- $(ACE_ROOT)/ace/Module.cpp \
- $(ACE_ROOT)/ace/Stream_Modules.h \
- $(ACE_ROOT)/ace/Stream_Modules.i \
- $(ACE_ROOT)/ace/Stream_Modules.cpp \
- $(ACE_ROOT)/ace/Stream.i \
- $(ACE_ROOT)/ace/Stream.cpp JAWS/Pipeline_Handler.h \
- JAWS/Pipeline_Handler.cpp JAWS/Data_Block.h
-.obj/HTTP_10_Read.o .obj/HTTP_10_Read.so .shobj/HTTP_10_Read.o .shobj/HTTP_10_Read.so: HTTP_10_Read.cpp HTTP_10.h \
+ $(ACE_ROOT)/ace/Message_Block.i JAWS/Parse_Headers.h \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp JAWS/Headers.h \
+ HTTPU/http_base.h HTTPU/http_status.h HTTPU/http_headers.h \
$(ACE_ROOT)/ace/RB_Tree.h \
- $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/RB_Tree.i \
+ $(ACE_ROOT)/ace/RB_Tree.cpp HTTPU/parse_http_request.h \
+ HTTPU/parse_url.h
+.obj/HTTP_10_Read.o .obj/HTTP_10_Read.so .shobj/HTTP_10_Read.o .shobj/HTTP_10_Read.so: HTTP_10_Read.cpp HTTP_10.h \
+ $(ACE_ROOT)/ace/RB_Tree.h $(ACE_ROOT)/ace/ACE.h \
$(ACE_ROOT)/ace/OS.h \
$(ACE_ROOT)/ace/inc_user_config.h \
$(ACE_ROOT)/ace/config.h \
@@ -289,8 +232,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/streams.h \
$(ACE_ROOT)/ace/Basic_Types.h \
$(ACE_ROOT)/ace/Basic_Types.i \
- $(ACE_ROOT)/ace/OS.i \
- $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i $(ACE_ROOT)/ace/Trace.h \
$(ACE_ROOT)/ace/Log_Msg.h \
$(ACE_ROOT)/ace/Log_Record.h \
$(ACE_ROOT)/ace/ACE.i \
@@ -304,13 +246,11 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
$(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
$(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
- $(ACE_ROOT)/ace/Synch.i \
- $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Synch.i $(ACE_ROOT)/ace/Synch_T.h \
$(ACE_ROOT)/ace/Event_Handler.h \
$(ACE_ROOT)/ace/Event_Handler.i \
$(ACE_ROOT)/ace/Synch_T.i \
- $(ACE_ROOT)/ace/Thread.h \
- $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Thread.h $(ACE_ROOT)/ace/Thread.i \
$(ACE_ROOT)/ace/Atomic_Op.i \
$(ACE_ROOT)/ace/Synch_T.cpp \
$(ACE_ROOT)/ace/Singleton.i \
@@ -319,8 +259,8 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Object_Manager.i \
$(ACE_ROOT)/ace/Managed_Object.h \
$(ACE_ROOT)/ace/Managed_Object.i \
- $(ACE_ROOT)/ace/Managed_Object.cpp JAWS/Pipeline.h \
- $(ACE_ROOT)/ace/Service_Config.h \
+ $(ACE_ROOT)/ace/Managed_Object.cpp JAWS/Export.h \
+ JAWS/Pipeline.h $(ACE_ROOT)/ace/Service_Config.h \
$(ACE_ROOT)/ace/Service_Object.h \
$(ACE_ROOT)/ace/Shared_Object.h \
$(ACE_ROOT)/ace/Shared_Object.i \
@@ -328,8 +268,11 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Signal.h \
$(ACE_ROOT)/ace/Containers.h \
$(ACE_ROOT)/ace/Containers.i \
- $(ACE_ROOT)/ace/Containers.cpp \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
$(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
$(ACE_ROOT)/ace/Malloc.i \
$(ACE_ROOT)/ace/Malloc_T.h \
$(ACE_ROOT)/ace/Free_List.h \
@@ -360,13 +303,17 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Message_Block.h \
$(ACE_ROOT)/ace/Message_Block.i \
$(ACE_ROOT)/ace/Time_Value.h \
- $(ACE_ROOT)/ace/Module.h \
- $(ACE_ROOT)/ace/Task_T.h \
+ $(ACE_ROOT)/ace/Module.h $(ACE_ROOT)/ace/Task_T.h \
$(ACE_ROOT)/ace/Message_Queue.h \
+ $(ACE_ROOT)/ace/Message_Queue_T.h \
+ $(ACE_ROOT)/ace/Message_Queue_T.i \
+ $(ACE_ROOT)/ace/Message_Queue_T.cpp \
$(ACE_ROOT)/ace/Strategies.h \
$(ACE_ROOT)/ace/Strategies_T.h \
$(ACE_ROOT)/ace/Synch_Options.h \
$(ACE_ROOT)/ace/Synch_Options.i \
+ $(ACE_ROOT)/ace/Thread_Manager.h \
+ $(ACE_ROOT)/ace/Thread_Manager.i \
$(ACE_ROOT)/ace/Hash_Map_Manager.h \
$(ACE_ROOT)/ace/Hash_Map_Manager.cpp \
$(ACE_ROOT)/ace/Strategies_T.i \
@@ -375,15 +322,11 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Service_Types.h \
$(ACE_ROOT)/ace/Service_Types.i \
$(ACE_ROOT)/ace/Service_Repository.i \
- $(ACE_ROOT)/ace/Thread_Manager.h \
- $(ACE_ROOT)/ace/Thread_Manager.i \
$(ACE_ROOT)/ace/WFMO_Reactor.h \
$(ACE_ROOT)/ace/WFMO_Reactor.i \
$(ACE_ROOT)/ace/Strategies.i \
$(ACE_ROOT)/ace/Message_Queue.i \
- $(ACE_ROOT)/ace/Message_Queue.cpp \
- $(ACE_ROOT)/ace/Task.h \
- $(ACE_ROOT)/ace/Task.i \
+ $(ACE_ROOT)/ace/Task.h $(ACE_ROOT)/ace/Task.i \
$(ACE_ROOT)/ace/Task_T.i \
$(ACE_ROOT)/ace/Task_T.cpp \
$(ACE_ROOT)/ace/Module.i \
@@ -395,22 +338,19 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Stream.cpp JAWS/Pipeline_Handler.h \
JAWS/Pipeline_Handler.cpp JAWS/Data_Block.h JAWS/JAWS.h JAWS/IO.h \
$(ACE_ROOT)/ace/Asynch_IO.h \
+ $(ACE_ROOT)/ace/Asynch_IO.i \
$(ACE_ROOT)/ace/SOCK_Stream.h \
- $(ACE_ROOT)/ace/SOCK_IO.h \
- $(ACE_ROOT)/ace/SOCK.h \
- $(ACE_ROOT)/ace/Addr.h \
- $(ACE_ROOT)/ace/Addr.i \
+ $(ACE_ROOT)/ace/SOCK_IO.h $(ACE_ROOT)/ace/SOCK.h \
+ $(ACE_ROOT)/ace/Addr.h $(ACE_ROOT)/ace/Addr.i \
$(ACE_ROOT)/ace/IPC_SAP.h \
- $(ACE_ROOT)/ace/IPC_SAP.i \
- $(ACE_ROOT)/ace/SOCK.i \
+ $(ACE_ROOT)/ace/IPC_SAP.i $(ACE_ROOT)/ace/SOCK.i \
$(ACE_ROOT)/ace/SOCK_IO.i \
$(ACE_ROOT)/ace/INET_Addr.h \
$(ACE_ROOT)/ace/INET_Addr.i \
$(ACE_ROOT)/ace/SOCK_Stream.i JAWS/IO_Handler.h \
JAWS/Policy.h JAWS/Concurrency.h
.obj/HTTP_10_Parse.o .obj/HTTP_10_Parse.so .shobj/HTTP_10_Parse.o .shobj/HTTP_10_Parse.so: HTTP_10_Parse.cpp HTTP_10.h \
- $(ACE_ROOT)/ace/RB_Tree.h \
- $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/RB_Tree.h $(ACE_ROOT)/ace/ACE.h \
$(ACE_ROOT)/ace/OS.h \
$(ACE_ROOT)/ace/inc_user_config.h \
$(ACE_ROOT)/ace/config.h \
@@ -419,8 +359,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/streams.h \
$(ACE_ROOT)/ace/Basic_Types.h \
$(ACE_ROOT)/ace/Basic_Types.i \
- $(ACE_ROOT)/ace/OS.i \
- $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i $(ACE_ROOT)/ace/Trace.h \
$(ACE_ROOT)/ace/Log_Msg.h \
$(ACE_ROOT)/ace/Log_Record.h \
$(ACE_ROOT)/ace/ACE.i \
@@ -434,13 +373,11 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
$(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
$(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
- $(ACE_ROOT)/ace/Synch.i \
- $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Synch.i $(ACE_ROOT)/ace/Synch_T.h \
$(ACE_ROOT)/ace/Event_Handler.h \
$(ACE_ROOT)/ace/Event_Handler.i \
$(ACE_ROOT)/ace/Synch_T.i \
- $(ACE_ROOT)/ace/Thread.h \
- $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Thread.h $(ACE_ROOT)/ace/Thread.i \
$(ACE_ROOT)/ace/Atomic_Op.i \
$(ACE_ROOT)/ace/Synch_T.cpp \
$(ACE_ROOT)/ace/Singleton.i \
@@ -449,8 +386,8 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Object_Manager.i \
$(ACE_ROOT)/ace/Managed_Object.h \
$(ACE_ROOT)/ace/Managed_Object.i \
- $(ACE_ROOT)/ace/Managed_Object.cpp JAWS/Pipeline.h \
- $(ACE_ROOT)/ace/Service_Config.h \
+ $(ACE_ROOT)/ace/Managed_Object.cpp JAWS/Export.h \
+ JAWS/Pipeline.h $(ACE_ROOT)/ace/Service_Config.h \
$(ACE_ROOT)/ace/Service_Object.h \
$(ACE_ROOT)/ace/Shared_Object.h \
$(ACE_ROOT)/ace/Shared_Object.i \
@@ -458,8 +395,11 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Signal.h \
$(ACE_ROOT)/ace/Containers.h \
$(ACE_ROOT)/ace/Containers.i \
- $(ACE_ROOT)/ace/Containers.cpp \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
$(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
$(ACE_ROOT)/ace/Malloc.i \
$(ACE_ROOT)/ace/Malloc_T.h \
$(ACE_ROOT)/ace/Free_List.h \
@@ -490,13 +430,17 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Message_Block.h \
$(ACE_ROOT)/ace/Message_Block.i \
$(ACE_ROOT)/ace/Time_Value.h \
- $(ACE_ROOT)/ace/Module.h \
- $(ACE_ROOT)/ace/Task_T.h \
+ $(ACE_ROOT)/ace/Module.h $(ACE_ROOT)/ace/Task_T.h \
$(ACE_ROOT)/ace/Message_Queue.h \
+ $(ACE_ROOT)/ace/Message_Queue_T.h \
+ $(ACE_ROOT)/ace/Message_Queue_T.i \
+ $(ACE_ROOT)/ace/Message_Queue_T.cpp \
$(ACE_ROOT)/ace/Strategies.h \
$(ACE_ROOT)/ace/Strategies_T.h \
$(ACE_ROOT)/ace/Synch_Options.h \
$(ACE_ROOT)/ace/Synch_Options.i \
+ $(ACE_ROOT)/ace/Thread_Manager.h \
+ $(ACE_ROOT)/ace/Thread_Manager.i \
$(ACE_ROOT)/ace/Hash_Map_Manager.h \
$(ACE_ROOT)/ace/Hash_Map_Manager.cpp \
$(ACE_ROOT)/ace/Strategies_T.i \
@@ -505,15 +449,11 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Service_Types.h \
$(ACE_ROOT)/ace/Service_Types.i \
$(ACE_ROOT)/ace/Service_Repository.i \
- $(ACE_ROOT)/ace/Thread_Manager.h \
- $(ACE_ROOT)/ace/Thread_Manager.i \
$(ACE_ROOT)/ace/WFMO_Reactor.h \
$(ACE_ROOT)/ace/WFMO_Reactor.i \
$(ACE_ROOT)/ace/Strategies.i \
$(ACE_ROOT)/ace/Message_Queue.i \
- $(ACE_ROOT)/ace/Message_Queue.cpp \
- $(ACE_ROOT)/ace/Task.h \
- $(ACE_ROOT)/ace/Task.i \
+ $(ACE_ROOT)/ace/Task.h $(ACE_ROOT)/ace/Task.i \
$(ACE_ROOT)/ace/Task_T.i \
$(ACE_ROOT)/ace/Task_T.cpp \
$(ACE_ROOT)/ace/Module.i \
@@ -525,23 +465,22 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Stream.cpp JAWS/Pipeline_Handler.h \
JAWS/Pipeline_Handler.cpp JAWS/Data_Block.h JAWS/JAWS.h JAWS/IO.h \
$(ACE_ROOT)/ace/Asynch_IO.h \
+ $(ACE_ROOT)/ace/Asynch_IO.i \
$(ACE_ROOT)/ace/SOCK_Stream.h \
- $(ACE_ROOT)/ace/SOCK_IO.h \
- $(ACE_ROOT)/ace/SOCK.h \
- $(ACE_ROOT)/ace/Addr.h \
- $(ACE_ROOT)/ace/Addr.i \
+ $(ACE_ROOT)/ace/SOCK_IO.h $(ACE_ROOT)/ace/SOCK.h \
+ $(ACE_ROOT)/ace/Addr.h $(ACE_ROOT)/ace/Addr.i \
$(ACE_ROOT)/ace/IPC_SAP.h \
- $(ACE_ROOT)/ace/IPC_SAP.i \
- $(ACE_ROOT)/ace/SOCK.i \
+ $(ACE_ROOT)/ace/IPC_SAP.i $(ACE_ROOT)/ace/SOCK.i \
$(ACE_ROOT)/ace/SOCK_IO.i \
$(ACE_ROOT)/ace/INET_Addr.h \
$(ACE_ROOT)/ace/INET_Addr.i \
$(ACE_ROOT)/ace/SOCK_Stream.i JAWS/IO_Handler.h \
- JAWS/Policy.h JAWS/Concurrency.h
-.obj/HTTP_10_Write.o .obj/HTTP_10_Write.so .shobj/HTTP_10_Write.o .shobj/HTTP_10_Write.so: HTTP_10_Write.cpp HTTP_10.h \
- $(ACE_ROOT)/ace/RB_Tree.h \
- $(ACE_ROOT)/ace/ACE.h \
- $(ACE_ROOT)/ace/OS.h \
+ JAWS/Policy.h JAWS/Concurrency.h HTTP_10_Request.h \
+ HTTPU/http_request.h JAWS/Parse_Headers.h JAWS/Headers.h \
+ HTTPU/http_base.h HTTPU/http_status.h HTTPU/http_headers.h \
+ HTTPU/parse_http_request.h HTTPU/parse_url.h
+.obj/HTTP_10_Write.o .obj/HTTP_10_Write.so .shobj/HTTP_10_Write.o .shobj/HTTP_10_Write.so: HTTP_10_Write.cpp JAWS/JAWS.h JAWS/IO.h \
+ $(ACE_ROOT)/ace/ACE.h $(ACE_ROOT)/ace/OS.h \
$(ACE_ROOT)/ace/inc_user_config.h \
$(ACE_ROOT)/ace/config.h \
$(ACE_ROOT)/ace/config-sunos5.5.h \
@@ -549,47 +488,38 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/streams.h \
$(ACE_ROOT)/ace/Basic_Types.h \
$(ACE_ROOT)/ace/Basic_Types.i \
- $(ACE_ROOT)/ace/OS.i \
- $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i $(ACE_ROOT)/ace/Trace.h \
$(ACE_ROOT)/ace/Log_Msg.h \
$(ACE_ROOT)/ace/Log_Record.h \
$(ACE_ROOT)/ace/ACE.i \
$(ACE_ROOT)/ace/Log_Priority.h \
$(ACE_ROOT)/ace/Log_Record.i \
- $(ACE_ROOT)/ace/RB_Tree.i \
- $(ACE_ROOT)/ace/RB_Tree.cpp JAWS/Pipeline_Tasks.h \
- $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Asynch_IO.h \
+ $(ACE_ROOT)/ace/Task.h \
+ $(ACE_ROOT)/ace/Service_Object.h \
+ $(ACE_ROOT)/ace/Shared_Object.h \
+ $(ACE_ROOT)/ace/Shared_Object.i \
+ $(ACE_ROOT)/ace/Event_Handler.h \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Service_Object.i \
+ $(ACE_ROOT)/ace/Thread_Manager.h \
+ $(ACE_ROOT)/ace/Thread.h $(ACE_ROOT)/ace/Thread.i \
$(ACE_ROOT)/ace/Synch.h \
$(ACE_ROOT)/ace/SV_Semaphore_Complex.h \
$(ACE_ROOT)/ace/SV_Semaphore_Simple.h \
$(ACE_ROOT)/ace/SV_Semaphore_Simple.i \
$(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
- $(ACE_ROOT)/ace/Synch.i \
- $(ACE_ROOT)/ace/Synch_T.h \
- $(ACE_ROOT)/ace/Event_Handler.h \
- $(ACE_ROOT)/ace/Event_Handler.i \
+ $(ACE_ROOT)/ace/Synch.i $(ACE_ROOT)/ace/Synch_T.h \
$(ACE_ROOT)/ace/Synch_T.i \
- $(ACE_ROOT)/ace/Thread.h \
- $(ACE_ROOT)/ace/Thread.i \
$(ACE_ROOT)/ace/Atomic_Op.i \
$(ACE_ROOT)/ace/Synch_T.cpp \
- $(ACE_ROOT)/ace/Singleton.i \
- $(ACE_ROOT)/ace/Singleton.cpp \
- $(ACE_ROOT)/ace/Object_Manager.h \
- $(ACE_ROOT)/ace/Object_Manager.i \
- $(ACE_ROOT)/ace/Managed_Object.h \
- $(ACE_ROOT)/ace/Managed_Object.i \
- $(ACE_ROOT)/ace/Managed_Object.cpp JAWS/Pipeline.h \
- $(ACE_ROOT)/ace/Service_Config.h \
- $(ACE_ROOT)/ace/Service_Object.h \
- $(ACE_ROOT)/ace/Shared_Object.h \
- $(ACE_ROOT)/ace/Shared_Object.i \
- $(ACE_ROOT)/ace/Service_Object.i \
- $(ACE_ROOT)/ace/Signal.h \
$(ACE_ROOT)/ace/Containers.h \
$(ACE_ROOT)/ace/Containers.i \
- $(ACE_ROOT)/ace/Containers.cpp \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
$(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
$(ACE_ROOT)/ace/Malloc.i \
$(ACE_ROOT)/ace/Malloc_T.h \
$(ACE_ROOT)/ace/Free_List.h \
@@ -598,10 +528,27 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Malloc_T.i \
$(ACE_ROOT)/ace/Malloc_T.cpp \
$(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Signal.h $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Object_Manager.h \
+ $(ACE_ROOT)/ace/Object_Manager.i \
+ $(ACE_ROOT)/ace/Managed_Object.h \
+ $(ACE_ROOT)/ace/Managed_Object.i \
+ $(ACE_ROOT)/ace/Managed_Object.cpp \
$(ACE_ROOT)/ace/Mem_Map.h \
$(ACE_ROOT)/ace/Mem_Map.i \
$(ACE_ROOT)/ace/Memory_Pool.i \
- $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Thread_Manager.i \
+ $(ACE_ROOT)/ace/Task.i $(ACE_ROOT)/ace/Task_T.h \
+ $(ACE_ROOT)/ace/Message_Queue.h \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/Message_Block.i \
+ $(ACE_ROOT)/ace/IO_Cntl_Msg.h \
+ $(ACE_ROOT)/ace/Message_Queue_T.h \
+ $(ACE_ROOT)/ace/Message_Queue_T.i \
+ $(ACE_ROOT)/ace/Message_Queue_T.cpp \
+ $(ACE_ROOT)/ace/Strategies.h \
+ $(ACE_ROOT)/ace/Strategies_T.h \
+ $(ACE_ROOT)/ace/Service_Config.h \
$(ACE_ROOT)/ace/SString.h \
$(ACE_ROOT)/ace/SString.i \
$(ACE_ROOT)/ace/Service_Config.i \
@@ -615,16 +562,6 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Reactor.i \
$(ACE_ROOT)/ace/Reactor_Impl.h \
$(ACE_ROOT)/ace/Svc_Conf_Tokens.h \
- $(ACE_ROOT)/ace/Stream.h \
- $(ACE_ROOT)/ace/IO_Cntl_Msg.h \
- $(ACE_ROOT)/ace/Message_Block.h \
- $(ACE_ROOT)/ace/Message_Block.i \
- $(ACE_ROOT)/ace/Time_Value.h \
- $(ACE_ROOT)/ace/Module.h \
- $(ACE_ROOT)/ace/Task_T.h \
- $(ACE_ROOT)/ace/Message_Queue.h \
- $(ACE_ROOT)/ace/Strategies.h \
- $(ACE_ROOT)/ace/Strategies_T.h \
$(ACE_ROOT)/ace/Synch_Options.h \
$(ACE_ROOT)/ace/Synch_Options.i \
$(ACE_ROOT)/ace/Hash_Map_Manager.h \
@@ -635,38 +572,41 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Service_Types.h \
$(ACE_ROOT)/ace/Service_Types.i \
$(ACE_ROOT)/ace/Service_Repository.i \
- $(ACE_ROOT)/ace/Thread_Manager.h \
- $(ACE_ROOT)/ace/Thread_Manager.i \
$(ACE_ROOT)/ace/WFMO_Reactor.h \
$(ACE_ROOT)/ace/WFMO_Reactor.i \
$(ACE_ROOT)/ace/Strategies.i \
$(ACE_ROOT)/ace/Message_Queue.i \
- $(ACE_ROOT)/ace/Message_Queue.cpp \
- $(ACE_ROOT)/ace/Task.h \
- $(ACE_ROOT)/ace/Task.i \
$(ACE_ROOT)/ace/Task_T.i \
$(ACE_ROOT)/ace/Task_T.cpp \
- $(ACE_ROOT)/ace/Module.i \
+ $(ACE_ROOT)/ace/Module.h $(ACE_ROOT)/ace/Module.i \
$(ACE_ROOT)/ace/Module.cpp \
$(ACE_ROOT)/ace/Stream_Modules.h \
$(ACE_ROOT)/ace/Stream_Modules.i \
$(ACE_ROOT)/ace/Stream_Modules.cpp \
- $(ACE_ROOT)/ace/Stream.i \
- $(ACE_ROOT)/ace/Stream.cpp JAWS/Pipeline_Handler.h \
- JAWS/Pipeline_Handler.cpp JAWS/Data_Block.h JAWS/JAWS.h JAWS/IO.h \
- $(ACE_ROOT)/ace/Asynch_IO.h \
+ $(ACE_ROOT)/ace/Asynch_IO.i \
$(ACE_ROOT)/ace/SOCK_Stream.h \
- $(ACE_ROOT)/ace/SOCK_IO.h \
- $(ACE_ROOT)/ace/SOCK.h \
- $(ACE_ROOT)/ace/Addr.h \
- $(ACE_ROOT)/ace/Addr.i \
+ $(ACE_ROOT)/ace/SOCK_IO.h $(ACE_ROOT)/ace/SOCK.h \
+ $(ACE_ROOT)/ace/Addr.h $(ACE_ROOT)/ace/Addr.i \
$(ACE_ROOT)/ace/IPC_SAP.h \
- $(ACE_ROOT)/ace/IPC_SAP.i \
- $(ACE_ROOT)/ace/SOCK.i \
+ $(ACE_ROOT)/ace/IPC_SAP.i $(ACE_ROOT)/ace/SOCK.i \
$(ACE_ROOT)/ace/SOCK_IO.i \
$(ACE_ROOT)/ace/INET_Addr.h \
$(ACE_ROOT)/ace/INET_Addr.i \
- $(ACE_ROOT)/ace/SOCK_Stream.i JAWS/IO_Handler.h \
- JAWS/Policy.h JAWS/Concurrency.h
+ $(ACE_ROOT)/ace/SOCK_Stream.i \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp JAWS/Export.h \
+ JAWS/IO_Handler.h JAWS/Policy.h JAWS/Concurrency.h HTTP_10.h \
+ $(ACE_ROOT)/ace/RB_Tree.h \
+ $(ACE_ROOT)/ace/RB_Tree.i \
+ $(ACE_ROOT)/ace/RB_Tree.cpp JAWS/Pipeline_Tasks.h \
+ JAWS/Pipeline.h $(ACE_ROOT)/ace/Stream.h \
+ $(ACE_ROOT)/ace/Time_Value.h \
+ $(ACE_ROOT)/ace/Stream.i \
+ $(ACE_ROOT)/ace/Stream.cpp JAWS/Pipeline_Handler.h \
+ JAWS/Pipeline_Handler.cpp JAWS/Data_Block.h HTTP_10_Request.h \
+ HTTPU/http_request.h JAWS/Parse_Headers.h JAWS/Headers.h \
+ HTTPU/http_base.h HTTPU/http_status.h HTTPU/http_headers.h \
+ HTTPU/parse_http_request.h HTTPU/parse_url.h
# IF YOU PUT ANYTHING HERE IT WILL GO AWAY