asternet/Asterisk.2013/Asterisk.NET/FastAGI/AGIReader.cs
2015-01-03 15:37:29 +00:00

90 lines
2.6 KiB
C#

using System.Collections.Generic;
using System.IO;
using AsterNET.IO;
namespace AsterNET.FastAGI
{
public class AGIReader
{
#if LOGGER
private readonly Logger logger = Logger.Instance();
#endif
private readonly SocketConnection socket;
public AGIReader(SocketConnection socket)
{
this.socket = socket;
}
public AGIRequest ReadRequest()
{
var lines = new List<string>();
try
{
#if LOGGER
logger.Info("AGIReader.ReadRequest():");
#endif
string line;
while ((line = socket.ReadLine()) != null)
{
if (line.Length == 0)
break;
lines.Add(line);
#if LOGGER
logger.Info(line);
#endif
}
}
catch (IOException ex)
{
throw new AGINetworkException("Unable to read request from Asterisk: " + ex.Message, ex);
}
var request = new AGIRequest(lines)
{
LocalAddress = socket.LocalAddress,
LocalPort = socket.LocalPort,
RemoteAddress = socket.RemoteAddress,
RemotePort = socket.RemotePort
};
return request;
}
public AGIReply ReadReply()
{
string line;
var badSyntax = ((int) AGIReplyStatuses.SC_INVALID_COMMAND_SYNTAX).ToString();
var lines = new List<string>();
try
{
line = socket.ReadLine();
}
catch (IOException ex)
{
throw new AGINetworkException("Unable to read reply from Asterisk: " + ex.Message, ex);
}
if (line == null)
throw new AGIHangupException();
lines.Add(line);
// read synopsis and usage if statuscode is 520
if (line.StartsWith(badSyntax))
try
{
while ((line = socket.ReadLine()) != null)
{
lines.Add(line);
if (line.StartsWith(badSyntax))
break;
}
}
catch (IOException ex)
{
throw new AGINetworkException("Unable to read reply from Asterisk: " + ex.Message, ex);
}
return new AGIReply(lines);
}
}
}