private void GenerateRequest(SipMessageWriter writer, SipMessageReader reader, Methods method) { writer.WriteRequestLine(method, trunk.Uri); writer.WriteVia(ToConnectionAddresses.Transport, ToConnectionAddresses.LocalEndPoint, TransactionId); for (int i = 0; i < reader.Count.HeaderCount; i++) { switch (reader.Headers[i].HeaderName) { case HeaderNames.From: case HeaderNames.To: case HeaderNames.CallId: writer.WriteHeader(reader, i); break; } } writer.WriteMaxForwards(70); writer.WriteCseq(reader.CSeq.Value, method); writer.WriteContentLength(0); writer.WriteCustomHeaders(); writer.WriteCRLF(); }
public void GenerateForwardedResponse(SipMessageWriter writer, SipMessageReader response, ArraySegment <byte> content, ConnectionAddresses ca) { //if (response.StatusCode.Is2xx && response.To.Tag.IsValid) // trunk.AddDialogs(tag, new Dialog(response, ca), dialog2); if (response.CSeq.Method == Methods.Byem) { trunk.RemoveDialog1(tag); trunk.RemoveDialog2(tag); } writer.WriteStatusLine(response.StatusCode); for (int i = 0; i < response.Count.HeaderCount; i++) { switch (response.Headers[i].HeaderName) { case HeaderNames.Via: writer.Write(SipMessageWriter.C.Via, SipMessageWriter.C.HCOLON, via); writer.WriteCRLF(); break; case HeaderNames.WwwAuthenticate: case HeaderNames.ProxyAuthenticate: break; case HeaderNames.To: writer.WriteTo(dialog2.LocalUri, dialog2.LocalTag); break; case HeaderNames.From: writer.WriteFrom(dialog2.RemoteUri, dialog2.RemoteTag); break; case HeaderNames.CSeq: writer.WriteCseq(dialog2.RemoteCseq, response.CSeq.Method); break; case HeaderNames.Contact: writer.WriteContact(ca.LocalEndPoint, ca.Transport); break; default: writer.WriteHeader(response, i); break; } } if (response.ContentLength == int.MinValue) { writer.WriteContentLength(content.Count); } writer.WriteCustomHeaders(); writer.WriteCRLF(); writer.Write(content); }
public void GenerateForwardedRequest(SipMessageWriter writer, SipMessageReader reader, ArraySegment <byte> content, ConnectionAddresses fromConnectionAddress, int serverTransactionId) { dialog2 = new Dialog(reader, tag, fromConnectionAddress); //trunk.AddDialog2(tag, dialog2); ///////////////////////////////////////////////////////////////////////////////// writer.WriteRequestLine(reader.Method, dialog1.RemoteUri); //var msReceivedCid = fromConnectionAddress.ToLowerHexChars(serverTransactionId); //writer.WriteVia(dialog1.Transport, dialog1.LocalEndPoint, TransactionId, msReceivedCid); writer.WriteVia(dialog1.Transport, dialog1.LocalEndPoint, TransactionId); for (int i = 0; i < reader.Count.HeaderCount; i++) { switch (reader.Headers[i].HeaderName) { case HeaderNames.MaxForwards: writer.WriteMaxForwards((reader.MaxForwards == int.MinValue) ? 69 : reader.MaxForwards - 1); break; case HeaderNames.Contact: writer.WriteContact(dialog1.LocalEndPoint, dialog1.Transport); break; case HeaderNames.To: writer.WriteTo(dialog1.RemoteUri, dialog1.RemoteTag); break; case HeaderNames.From: writer.WriteFrom(reader.From.AddrSpec.Value, tag); break; case HeaderNames.Authorization: break; default: writer.WriteHeader(reader, i); break; case HeaderNames.Via: via = reader.Headers[i].Value.DeepCopy(); break; } } if (reader.ContentLength == int.MinValue) { writer.WriteContentLength(content.Count); } writer.WriteCustomHeaders(); writer.WriteCRLF(); writer.Write(content); }
public void GenerateForwardedRequest(SipMessageWriter writer, SipMessageReader reader, ArraySegment <byte> content, ConnectionAddresses fromConnectionAddress, int serverTransactionId) { //dialog2 = new Dialog(reader, fromTag, fromConnectionAddress); Dialog dialog1 = null; if (HexEncoding.TryParseHex8(reader.To.Tag, out tag)) { dialog1 = trunk.GetDialog1(tag); } else { tag = DialogManager.NewLocalTag(); } dialog2 = new Dialog(reader, tag, fromConnectionAddress); trunk.AddDialog2(tag, dialog2); ///////////////////////////////////////////////////////////////////////////////// writer.WriteRequestLine(reader.Method, binding.AddrSpec); //var msReceivedCid = fromConnectionAddress.ToLowerHexChars(serverTransactionId); //writer.WriteVia(binding.ConnectionAddresses.Transport, binding.ConnectionAddresses.LocalEndPoint, TransactionId, msReceivedCid); writer.WriteVia(binding.ConnectionAddresses.Transport, binding.ConnectionAddresses.LocalEndPoint, TransactionId); for (int i = 0; i < reader.Count.HeaderCount; i++) { switch (reader.Headers[i].HeaderName) { case HeaderNames.MaxForwards: writer.WriteMaxForwards((reader.MaxForwards == int.MinValue) ? 69 : reader.MaxForwards - 1); break; case HeaderNames.Contact: writer.WriteContact(binding.ConnectionAddresses.LocalEndPoint, binding.ConnectionAddresses.Transport); break; case HeaderNames.To: writer.WriteTo(trunk.ForwardCallToUri, (dialog1 != null) ? dialog1.RemoteTag : ByteArrayPart.Invalid); break; case HeaderNames.From: writer.WriteFrom(reader.From.AddrSpec.Value, tag); break; case HeaderNames.Authorization: break; default: writer.WriteHeader(reader, i); break; case HeaderNames.Via: via = reader.Headers[i].Value.DeepCopy(); break; } } if (reader.ContentLength == int.MinValue) { writer.WriteContentLength(content.Count); } writer.WriteCustomHeaders(); writer.WriteCRLF(); writer.Write(content); }
public void GenerateForwardedResponse(SipMessageWriter writer, SipMessageReader reader, ArraySegment <byte> content, ConnectionAddresses ca) { writer.WriteStatusLine(reader.StatusCode); int recordRouteCount = reader.Count.RecordRouteCount; bool writeContact = true; for (int i = 1; i < reader.Count.ViaCount; i++) { writer.WriteHeader(HeaderNames.Via, reader.Via[i].Value); } for (int i = 0; i < reader.Count.HeaderCount; i++) { switch (reader.Headers[i].HeaderName) { case HeaderNames.Via: break; case HeaderNames.Authorization: case HeaderNames.ProxyAuthorization: // remove exact authorization header break; case HeaderNames.Contact: if (writeContact) { writer.WriteContact(reader.Contact[0].AddrSpec.User, ca.LocalEndPoint, ca.Transport, reader.Contact[0].SipInstance); writeContact = false; } break; case HeaderNames.RecordRoute: { recordRouteCount--; if (recordRouteCount != recordRouteIndex) { goto default; } writer.WriteRecordRoute(ca.Transport, ca.LocalEndPoint); } break; default: writer.WriteHeader(reader, i); break; } } if (reader.ContentLength == int.MinValue) { writer.WriteContentLength(content.Count); } writer.WriteCustomHeaders(); writer.WriteCRLF(); writer.Write(content); }
public void GenerateForwardedRequest(SipMessageWriter writer, SipMessageReader reader, ArraySegment <byte> content, ConnectionAddresses fromConnectionAddress, int serverTransactionId) { Tracer.WriteInformation("LocalProxie.GenerateForwardedRequest"); recordRouteIndex = reader.Count.RecordRouteCount; writer.WriteRequestLine(reader.Method, binding.AddrSpec); //var msReceivedCid = fromConnectionAddress.ToLowerHexChars(serverTransactionId); //writer.WriteVia(binding.ConnectionAddresses.Transport, binding.ConnectionAddresses.LocalEndPoint, TransactionId, msReceivedCid); //writer.WriteRecordRoute(binding.ConnectionAddresses.Transport, binding.ConnectionAddresses.LocalEndPoint, msReceivedCid); writer.WriteVia(binding.ConnectionAddresses.Transport, binding.ConnectionAddresses.LocalEndPoint, TransactionId); writer.WriteRecordRoute(binding.ConnectionAddresses.Transport, binding.ConnectionAddresses.LocalEndPoint); bool writeContact = true; for (int i = 0; i < reader.Count.HeaderCount; i++) { switch (reader.Headers[i].HeaderName) { case HeaderNames.MaxForwards: { int maxForwards = (reader.MaxForwards == int.MinValue) ? 70 : reader.MaxForwards; writer.WriteMaxForwards(maxForwards - 1); } break; case HeaderNames.Authorization: case HeaderNames.ProxyAuthorization: // remove exact authorization header break; case HeaderNames.To: writer.WriteToHeader(reader, i, binding.Epid); break; case HeaderNames.Contact: if (writeContact) { writer.WriteContact(reader.Contact[0].AddrSpec.User, binding.ConnectionAddresses.LocalEndPoint, binding.ConnectionAddresses.Transport, reader.Contact[0].SipInstance); writeContact = false; } break; default: writer.WriteHeader(reader, i); break; } } if (reader.ContentLength == int.MinValue) { writer.WriteContentLength(content.Count); } writer.WriteCustomHeaders(); writer.WriteCRLF(); writer.Write(content); }