[Freeswitch-svn] [commit] r3168 - in freeswitch/trunk/scripts: POE-Filter-FSSocket POE-Filter-FSSocket/examples POE-Filter-FSSocket/lib/POE/Filter socket

Freeswitch SVN ptinsley at freeswitch.org
Mon Oct 23 16:47:23 EDT 2006


Author: ptinsley
Date: Mon Oct 23 16:47:22 2006
New Revision: 3168

Modified:
   freeswitch/trunk/scripts/POE-Filter-FSSocket/CHANGES
   freeswitch/trunk/scripts/POE-Filter-FSSocket/examples/fsconsole.pl
   freeswitch/trunk/scripts/POE-Filter-FSSocket/lib/POE/Filter/FSSocket.pm
   freeswitch/trunk/scripts/socket/fsconsole.pl

Log:
Rework of Filter's handling of the socket with freeswitch, the previous implementation was a serious cheat.  We now properly handle the Content-Length tag and go out of line based mode and into length mode.

Also updated the console to show replies to commands.


Modified: freeswitch/trunk/scripts/POE-Filter-FSSocket/CHANGES
==============================================================================
--- freeswitch/trunk/scripts/POE-Filter-FSSocket/CHANGES	(original)
+++ freeswitch/trunk/scripts/POE-Filter-FSSocket/CHANGES	Mon Oct 23 16:47:22 2006
@@ -1,4 +1,15 @@
 =========================
+2006-10-23 00:15:32 v0_06
+=========================
+
+  2006-10-23 00:15:32 (r6) by ptinsley
+
+    reworked the handling of Content-Length based replies to deal with replies
+      that don't have \n at the end of their data block
+    Updated the curses example (fsconsole.pl)
+     - Added command/reply output
+
+=========================
 2006-10-14 00:08:00 v0_05
 =========================
 

Modified: freeswitch/trunk/scripts/POE-Filter-FSSocket/examples/fsconsole.pl
==============================================================================
--- freeswitch/trunk/scripts/POE-Filter-FSSocket/examples/fsconsole.pl	(original)
+++ freeswitch/trunk/scripts/POE-Filter-FSSocket/examples/fsconsole.pl	Mon Oct 23 16:47:22 2006
@@ -224,8 +224,14 @@
 	} else {
 		#see if we got connected at some point
 		if(defined($sockets{'localhost'})) {
-			#send the command
-			$sockets{'localhost'}->put($input);
+		  my $cmd;
+		  if ($input =~ /^log|^event/) {
+		    $cmd = $input;
+		  } else {
+		    $cmd = "api $input";
+		  }
+		  #send the command
+		  $sockets{'localhost'}->put($cmd);
 		}
 	}
 }
@@ -264,12 +270,14 @@
 		if($input->{'Content-Type'} eq "auth/request") {
 			$heap->{'server'}->put("auth $server_secret");
 		} elsif ($input->{'Content-Type'} eq "api/response") {
-			new_message('destination_window' => 0, 'message' => 'Response: ');
+			new_message('destination_window' => 0, 'message' => 'API Response: ');
 			new_message('destination_window' => 0, 'message' => $input->{'__DATA__'});
 		} elsif ($input->{'Content-Type'} eq "log/data") {
 			new_message('destination_window' => 1, 'message' => $input->{'__DATA__'});
 		} elsif ($input->{'Content-Type'} eq "text/event-plain") {
 			new_message('destination_window' => 2, 'message' => Dumper $input);
+		} elsif ($input->{'Content-Type'} eq "command/reply") {
+			new_message('destination_window' => 0, 'message' => 'Command Response: ' . $input->{'Reply-Text'});
 		}
 	};
 

Modified: freeswitch/trunk/scripts/POE-Filter-FSSocket/lib/POE/Filter/FSSocket.pm
==============================================================================
--- freeswitch/trunk/scripts/POE-Filter-FSSocket/lib/POE/Filter/FSSocket.pm	(original)
+++ freeswitch/trunk/scripts/POE-Filter-FSSocket/lib/POE/Filter/FSSocket.pm	Mon Oct 23 16:47:22 2006
@@ -11,9 +11,6 @@
   
   use POE qw(Component::Client::TCP Filter::FSSocket);
   use Data::Dumper;
-
-  my $auth_sent = 0;
-  my $password = "ClueCon";
   
   POE::Component::Client::TCP->new(
           'RemoteAddress' => '127.0.0.1',
@@ -25,6 +22,9 @@
   POE::Kernel->run();
   exit;
   
+  my $auth_sent = 0;
+  my $password = "ClueCon";
+  
   sub handle_server_input {
           my ($heap,$input) = @_[HEAP,ARG0];
   
@@ -44,10 +44,6 @@
           }
   }
 
-=head1 EXAMPLES
-
-See examples in the examples directory of the distribution.
-
 =head1 DESCRIPTION
 
 POE::Filter::FSSocket parses output from FreeSWITCH into hashes.  FreeSWITCH 
@@ -110,19 +106,18 @@
 use vars qw($VERSION);
 use base qw(POE::Filter);
 
-$VERSION = '0.05';
+$VERSION = '0.06';
 
-use POE::Filter::Line;
 use Data::Dumper;
 
 #self array
-sub LINE_FILTER()      {1}
-sub PARSER_STATE()     {2}
-sub PARSER_STATENEXT() {3}
-sub PARSED_RECORD()    {4}
-sub CURRENT_LENGTH()   {5}
-sub STRICT_PARSE()     {6}
-sub DEBUG_LEVEL()      {7}
+sub FRAMING_BUFFER()   {0}
+sub PARSER_STATE()     {1}
+sub PARSER_STATENEXT() {2}
+sub PARSED_RECORD()    {3}
+sub CURRENT_LENGTH()   {4}
+sub STRICT_PARSE()     {5}
+sub DEBUG_LEVEL()      {6}
 
 #states of the parser
 sub STATE_WAITING()     {1} #looking for new input
@@ -146,12 +141,8 @@
 		$strict = $args{'strict'};
 	}
 
-	#our filter is line based, don't reinvent the wheel
-	my $line_filter = POE::Filter::Line->new();
-
 	my $self = bless [
-		"",            #not used by me but the baseclass clone wants it here
-		$line_filter,  #LINE_FILTER
+		"",            #framing buffer
 		STATE_WAITING, #PARSER_STATE
 		undef,         #PARSER_STATE
 		{},            #PARSED_RECORD
@@ -166,22 +157,40 @@
 
 sub get_one_start {
 	my ($self, $stream) = @_;
-	$self->[LINE_FILTER]->get_one_start($stream);
+
+	#take all the chunks and put them in the buffer
+	$self->[FRAMING_BUFFER] .= join('', @{$stream});
 }
 
 sub get_one {
 	my $self = shift;
 
+	my $line;
+
 	while(1) {
-		#grab a line from the filter
-		my $line = $self->[LINE_FILTER]->get_one();
+		$line = "";
 
-		#quit if we can't get any lines
-		return [] unless @$line;
+		#see if we are in line based or length based mode
+		if($self->[PARSER_STATE] == STATE_TEXTRESPONSE) {
+			my $length = $self->[PARSED_RECORD]{'Content-Length'};
 
-		#get the actual line
-		$line = $line->[0];
-
+			if($self->[FRAMING_BUFFER] =~ s/^(.{$length})//s) {
+				$self->[PARSER_STATE] = STATE_FLUSH;
+				$self->[PARSED_RECORD]->{'__DATA__'} = $1;
+				return [ $self->[PARSED_RECORD] ];
+			} else {
+				#not engough in the buffer yet, come back later
+				return;
+			}
+		} else { #we are in normal line based mode
+			if($self->[FRAMING_BUFFER] =~ s/^(.*?)(\x0D\x0A?|\x0A\x0D?)//) {
+				$line = $1;
+			} else {
+				#not enough off of the socket yet, come back later
+				return [];
+			}
+		}
+		
 		if(($self->[PARSER_STATE] == STATE_WAITING) || ($self->[PARSER_STATE] == STATE_FLUSH)) {
 			#see if we need to wipe out the parsed_record info
 			if($self->[PARSER_STATE] == STATE_FLUSH) {
@@ -271,22 +280,6 @@
 					}
 				}
 			}
-		} elsif ($self->[PARSER_STATE] == STATE_TEXTRESPONSE) {
-			if($self->[CURRENT_LENGTH] == -1) {
-				$self->[CURRENT_LENGTH] = 0;
-				next;
-			}
-
-			$self->[CURRENT_LENGTH] += (length($line) + 1);
-
-			if(($self->[CURRENT_LENGTH] - 1) == $self->[PARSED_RECORD]{'Content-Length'}) {
-				$self->[PARSER_STATE] = STATE_FLUSH;
-				$self->[PARSED_RECORD]{'__DATA__'} .= $line;
-
-				return [$self->[PARSED_RECORD]];
-			} else {
-				$self->[PARSED_RECORD]{'__DATA__'} .= $line . "\n";
-			}
 		}
 	}
 }
@@ -305,7 +298,7 @@
 
 sub get_pending {
 	my $self = shift;
-	return $self->[LINE_FILTER]->get_pending();
+	return $self->[FRAMING_BUFFER];
 }
 
 sub get {

Modified: freeswitch/trunk/scripts/socket/fsconsole.pl
==============================================================================
--- freeswitch/trunk/scripts/socket/fsconsole.pl	(original)
+++ freeswitch/trunk/scripts/socket/fsconsole.pl	Mon Oct 23 16:47:22 2006
@@ -270,12 +270,14 @@
 		if($input->{'Content-Type'} eq "auth/request") {
 			$heap->{'server'}->put("auth $server_secret");
 		} elsif ($input->{'Content-Type'} eq "api/response") {
-			new_message('destination_window' => 0, 'message' => 'Response: ');
+			new_message('destination_window' => 0, 'message' => 'API Response: ');
 			new_message('destination_window' => 0, 'message' => $input->{'__DATA__'});
 		} elsif ($input->{'Content-Type'} eq "log/data") {
 			new_message('destination_window' => 1, 'message' => $input->{'__DATA__'});
 		} elsif ($input->{'Content-Type'} eq "text/event-plain") {
 			new_message('destination_window' => 2, 'message' => Dumper $input);
+		} elsif ($input->{'Content-Type'} eq "command/reply") {
+			new_message('destination_window' => 0, 'message' => 'Command Response: ' . $input->{'Reply-Text'});
 		}
 	};
 



More information about the Freeswitch-svn mailing list