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 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); }