From ca154010fec0afc4453c33f8f42b4e4b317989d4 Mon Sep 17 00:00:00 2001 From: Peter Kjellerstedt Date: Tue, 9 Jun 2009 17:54:20 +0200 Subject: [PATCH] rtsp: Added support for HTTP messages --- gst-libs/gst/rtsp/gstrtspconnection.c | 15 +++++++ gst-libs/gst/rtsp/gstrtspdefs.c | 8 ++++ gst-libs/gst/rtsp/gstrtspdefs.h | 12 +++++- gst-libs/gst/rtsp/gstrtspmessage.c | 81 +++++++++++++++++++++++++---------- gst-libs/gst/rtsp/gstrtspmessage.h | 9 +++- 5 files changed, 99 insertions(+), 26 deletions(-) diff --git a/gst-libs/gst/rtsp/gstrtspconnection.c b/gst-libs/gst/rtsp/gstrtspconnection.c index d807ec2..b9cf863 100644 --- a/gst-libs/gst/rtsp/gstrtspconnection.c +++ b/gst-libs/gst/rtsp/gstrtspconnection.c @@ -1350,6 +1350,21 @@ message_to_string (GstRTSPConnection * conn, GstRTSPMessage * message) g_string_append_printf (str, "RTSP/1.0 %d %s\r\n", message->type_data.response.code, message->type_data.response.reason); break; + case GST_RTSP_MESSAGE_HTTP_REQUEST: + /* create request string */ + g_string_append_printf (str, "%s %s HTTP/%s\r\n", + gst_rtsp_method_as_text (message->type_data.request.method), + message->type_data.request.uri, + gst_rtsp_version_as_text (message->type_data.request.version)); + /* add any authentication headers */ + add_auth_header (conn, message); + break; + case GST_RTSP_MESSAGE_HTTP_RESPONSE: + /* create response string */ + g_string_append_printf (str, "HTTP/%s %d %s\r\n", + gst_rtsp_version_as_text (message->type_data.request.version), + message->type_data.response.code, message->type_data.response.reason); + break; case GST_RTSP_MESSAGE_DATA: { guint8 data_header[4]; diff --git a/gst-libs/gst/rtsp/gstrtspdefs.c b/gst-libs/gst/rtsp/gstrtspdefs.c index 84eeb80..9a269f3 100644 --- a/gst-libs/gst/rtsp/gstrtspdefs.c +++ b/gst-libs/gst/rtsp/gstrtspdefs.c @@ -101,6 +101,8 @@ static const gchar *rtsp_methods[] = { "SETUP", "SET_PARAMETER", "TEARDOWN", + "GET", + "POST", NULL }; @@ -184,9 +186,12 @@ static const gchar *rtsp_headers[] = { "X-Receding-PlaylistChange", /* X-Receding-PlaylistChange */ "X-RTP-Info", /* X-RTP-Info */ "X-StartupProfile", /* X-StartupProfile */ + "Timestamp", /* Timestamp */ "Authentication-Info", /* Authentication-Info */ + "Host", /* Host */ + "X-Sessioncookie", /* X-Sessioncookie */ NULL }; @@ -339,6 +344,9 @@ gst_rtsp_version_as_text (GstRTSPVersion version) case GST_RTSP_VERSION_1_0: return "1.0"; + case GST_RTSP_VERSION_1_1: + return "1.1"; + default: return "0.0"; } diff --git a/gst-libs/gst/rtsp/gstrtspdefs.h b/gst-libs/gst/rtsp/gstrtspdefs.h index 63c3a76..84e9605 100644 --- a/gst-libs/gst/rtsp/gstrtspdefs.h +++ b/gst-libs/gst/rtsp/gstrtspdefs.h @@ -157,12 +157,14 @@ typedef enum { * GstRTSPVersion: * @GST_RTSP_VERSION_INVALID: unknown/invalid version * @GST_RTSP_VERSION_1_0: version 1.0 + * @GST_RTSP_VERSION_1_1: version 1.1 * * The supported RTSP versions. */ typedef enum { GST_RTSP_VERSION_INVALID = 0x00, - GST_RTSP_VERSION_1_0 = 0x10 + GST_RTSP_VERSION_1_0 = 0x10, + GST_RTSP_VERSION_1_1 = 0x11 } GstRTSPVersion; /** @@ -179,6 +181,8 @@ typedef enum { * @GST_RTSP_SETUP: the SETUP method * @GST_RTSP_SET_PARAMETER: the SET_PARAMETER method * @GST_RTSP_TEARDOWN: the TEARDOWN method + * @GST_RTSP_GET: the GET method (HTTP) + * @GST_RTSP_POST: the POST method (HTTP) * * The different supported RTSP methods. */ @@ -194,7 +198,9 @@ typedef enum { GST_RTSP_REDIRECT = (1 << 7), GST_RTSP_SETUP = (1 << 8), GST_RTSP_SET_PARAMETER = (1 << 9), - GST_RTSP_TEARDOWN = (1 << 10) + GST_RTSP_TEARDOWN = (1 << 10), + GST_RTSP_GET = (1 << 11), + GST_RTSP_POST = (1 << 12) } GstRTSPMethod; /** @@ -315,6 +321,8 @@ typedef enum { /* Since 0.10.25 */ GST_RTSP_HDR_AUTHENTICATION_INFO, /* Authentication-Info */ + GST_RTSP_HDR_HOST, /* Host */ + GST_RTSP_HDR_X_SESSIONCOOKIE, /* X-Sessioncookie */ GST_RTSP_HDR_LAST } GstRTSPHeaderField; diff --git a/gst-libs/gst/rtsp/gstrtspmessage.c b/gst-libs/gst/rtsp/gstrtspmessage.c index 116bcfe..28e4404 100644 --- a/gst-libs/gst/rtsp/gstrtspmessage.c +++ b/gst-libs/gst/rtsp/gstrtspmessage.c @@ -214,7 +214,8 @@ gst_rtsp_message_parse_request (GstRTSPMessage * msg, GstRTSPMethod * method, const gchar ** uri, GstRTSPVersion * version) { g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL); - g_return_val_if_fail (msg->type == GST_RTSP_MESSAGE_REQUEST, GST_RTSP_EINVAL); + g_return_val_if_fail (msg->type == GST_RTSP_MESSAGE_REQUEST || + msg->type == GST_RTSP_MESSAGE_HTTP_REQUEST, GST_RTSP_EINVAL); if (method) *method = msg->type_data.request.method; @@ -292,34 +293,41 @@ gst_rtsp_message_init_response (GstRTSPMessage * msg, GstRTSPStatusCode code, msg->hdr_fields = g_array_new (FALSE, FALSE, sizeof (RTSPKeyValue)); if (request) { - gchar *header; - - /* copy CSEQ */ - if (gst_rtsp_message_get_header (request, GST_RTSP_HDR_CSEQ, &header, - 0) == GST_RTSP_OK) { - gst_rtsp_message_add_header (msg, GST_RTSP_HDR_CSEQ, header); - } + if (request->type == GST_RTSP_MESSAGE_HTTP_REQUEST) { + msg->type = GST_RTSP_MESSAGE_HTTP_RESPONSE; + if (request->type_data.request.version != GST_RTSP_VERSION_INVALID) + msg->type_data.response.version = request->type_data.request.version; + else + msg->type_data.response.version = GST_RTSP_VERSION_1_1; + } else { + gchar *header; - /* copy session id */ - if (gst_rtsp_message_get_header (request, GST_RTSP_HDR_SESSION, &header, - 0) == GST_RTSP_OK) { - char *pos; + /* copy CSEQ */ + if (gst_rtsp_message_get_header (request, GST_RTSP_HDR_CSEQ, &header, + 0) == GST_RTSP_OK) { + gst_rtsp_message_add_header (msg, GST_RTSP_HDR_CSEQ, header); + } - header = g_strdup (header); - if ((pos = strchr (header, ';'))) { - *pos = '\0'; + /* copy session id */ + if (gst_rtsp_message_get_header (request, GST_RTSP_HDR_SESSION, &header, + 0) == GST_RTSP_OK) { + char *pos; + + header = g_strdup (header); + if ((pos = strchr (header, ';'))) { + *pos = '\0'; + } + g_strchomp (header); + gst_rtsp_message_take_header (msg, GST_RTSP_HDR_SESSION, header); } - g_strchomp (header); - gst_rtsp_message_take_header (msg, GST_RTSP_HDR_SESSION, header); - } - /* FIXME copy more headers? */ + /* FIXME copy more headers? */ + } } return GST_RTSP_OK; } - /** * gst_rtsp_message_parse_response: * @msg: a #GstRTSPMessage @@ -340,8 +348,8 @@ gst_rtsp_message_parse_response (GstRTSPMessage * msg, GstRTSPStatusCode * code, const gchar ** reason, GstRTSPVersion * version) { g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL); - g_return_val_if_fail (msg->type == GST_RTSP_MESSAGE_RESPONSE, - GST_RTSP_EINVAL); + g_return_val_if_fail (msg->type == GST_RTSP_MESSAGE_RESPONSE || + msg->type == GST_RTSP_MESSAGE_HTTP_RESPONSE, GST_RTSP_EINVAL); if (code) *code = msg->type_data.response.code; @@ -440,9 +448,11 @@ gst_rtsp_message_unset (GstRTSPMessage * msg) case GST_RTSP_MESSAGE_INVALID: break; case GST_RTSP_MESSAGE_REQUEST: + case GST_RTSP_MESSAGE_HTTP_REQUEST: g_free (msg->type_data.request.uri); break; case GST_RTSP_MESSAGE_RESPONSE: + case GST_RTSP_MESSAGE_HTTP_RESPONSE: g_free (msg->type_data.response.reason); break; case GST_RTSP_MESSAGE_DATA: @@ -794,6 +804,33 @@ gst_rtsp_message_dump (GstRTSPMessage * msg) g_print (" body: length %d\n", size); gst_util_dump_mem (data, size); break; + case GST_RTSP_MESSAGE_HTTP_REQUEST: + g_print ("HTTP request message %p\n", msg); + g_print (" request line:\n"); + g_print (" method: '%s'\n", + gst_rtsp_method_as_text (msg->type_data.request.method)); + g_print (" uri: '%s'\n", msg->type_data.request.uri); + g_print (" version: '%s'\n", + gst_rtsp_version_as_text (msg->type_data.request.version)); + g_print (" headers:\n"); + key_value_foreach (msg->hdr_fields, dump_key_value, NULL); + g_print (" body:\n"); + gst_rtsp_message_get_body (msg, &data, &size); + gst_util_dump_mem (data, size); + break; + case GST_RTSP_MESSAGE_HTTP_RESPONSE: + g_print ("HTTP response message %p\n", msg); + g_print (" status line:\n"); + g_print (" code: '%d'\n", msg->type_data.response.code); + g_print (" reason: '%s'\n", msg->type_data.response.reason); + g_print (" version: '%s'\n", + gst_rtsp_version_as_text (msg->type_data.response.version)); + g_print (" headers:\n"); + key_value_foreach (msg->hdr_fields, dump_key_value, NULL); + gst_rtsp_message_get_body (msg, &data, &size); + g_print (" body: length %d\n", size); + gst_util_dump_mem (data, size); + break; case GST_RTSP_MESSAGE_DATA: g_print ("RTSP data message %p\n", msg); g_print (" channel: '%d'\n", msg->type_data.data.channel); diff --git a/gst-libs/gst/rtsp/gstrtspmessage.h b/gst-libs/gst/rtsp/gstrtspmessage.h index a131f91..d3b6d3f 100644 --- a/gst-libs/gst/rtsp/gstrtspmessage.h +++ b/gst-libs/gst/rtsp/gstrtspmessage.h @@ -52,8 +52,10 @@ G_BEGIN_DECLS /** * GstRTSPMsgType: * @GST_RTSP_MESSAGE_INVALID: invalid message type - * @GST_RTSP_MESSAGE_REQUEST: request message - * @GST_RTSP_MESSAGE_RESPONSE: response message + * @GST_RTSP_MESSAGE_REQUEST: RTSP request message + * @GST_RTSP_MESSAGE_RESPONSE: RTSP response message + * @GST_RTSP_MESSAGE_HTTP_REQUEST: HTTP request message + * @GST_RTSP_MESSAGE_HTTP_RESPONSE: HTTP response message * @GST_RTSP_MESSAGE_DATA: data message * * The type of a message. @@ -63,6 +65,8 @@ typedef enum GST_RTSP_MESSAGE_INVALID, GST_RTSP_MESSAGE_REQUEST, GST_RTSP_MESSAGE_RESPONSE, + GST_RTSP_MESSAGE_HTTP_REQUEST, + GST_RTSP_MESSAGE_HTTP_RESPONSE, GST_RTSP_MESSAGE_DATA } GstRTSPMsgType; @@ -135,6 +139,7 @@ GstRTSPResult gst_rtsp_message_parse_response (GstRTSPMessage *msg, GstRTSPStatusCode *code, const gchar **reason, GstRTSPVersion *version); + /* data */ GstRTSPResult gst_rtsp_message_new_data (GstRTSPMessage **msg, guint8 channel); -- 2.7.4