res_pjsip_session: properly handle SDP from a forked call with early media
[asterisk/asterisk.git] / res / res_http_post.c
index 03d407f..44bb8ee 100644 (file)
@@ -17,7 +17,7 @@
  */
 
 /*!
- * \file 
+ * \file
  * \brief HTTP POST upload support for Asterisk HTTP server
  *
  * \author Terry Wilson <twilson@digium.com
@@ -33,8 +33,6 @@
 
 #include "asterisk.h"
 
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <gmime/gmime.h>
@@ -57,6 +55,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #ifdef GMIME_TYPE_CONTENT_TYPE
 #define AST_GMIME_VER_24
 #endif
+#if defined(GMIME_MAJOR_VERSION) && (GMIME_MAJOR_VERSION >= 3)
+#define AST_GMIME_VER_30
+#endif
 
 /* just a little structure to hold callback info for gmime */
 struct mime_cbinfo {
@@ -86,7 +87,11 @@ static void post_raw(GMimePart *part, const char *post_dir, const char *fn)
 
        stream = g_mime_stream_fs_new(fd);
 
+#ifdef AST_GMIME_VER_30
+       content = g_mime_part_get_content(part);
+#else
        content = g_mime_part_get_content_object(part);
+#endif
        g_mime_data_wrapper_write_to_stream(content, stream);
        g_mime_stream_flush(stream);
 
@@ -106,10 +111,14 @@ static GMimeMessage *parse_message(FILE *f)
 
        parser = g_mime_parser_new_with_stream(stream);
        g_mime_parser_set_respect_content_length(parser, 1);
-       
+
        g_object_unref(stream);
 
-       message = g_mime_parser_construct_message(parser);
+       message = g_mime_parser_construct_message(parser
+#ifdef AST_GMIME_VER_30
+                       , NULL
+#endif
+       );
 
        g_object_unref(parser);
 
@@ -213,7 +222,7 @@ static int find_sequence(char * inbuf, int inlen, char * matchbuf, int matchlen)
 * This function has two modes.  The first to find a boundary marker.  The
 * second is to find the filename immediately after the boundary.
 */
-static int readmimefile(FILE *fin, FILE *fout, char *boundary, int contentlen)
+static int readmimefile(struct ast_iostream *in, FILE *fout, char *boundary, int contentlen)
 {
        int find_filename = 0;
        char buf[4096];
@@ -224,7 +233,7 @@ static int readmimefile(FILE *fin, FILE *fout, char *boundary, int contentlen)
        int boundary_len;
        char * path_end, * path_start, * filespec;
 
-       if (NULL == fin || NULL == fout || NULL == boundary || 0 >= contentlen) {
+       if (NULL == in || NULL == fout || NULL == boundary || 0 >= contentlen) {
                return -1;
        }
 
@@ -238,8 +247,8 @@ static int readmimefile(FILE *fin, FILE *fout, char *boundary, int contentlen)
                }
 
                if (0 < num_to_read) {
-                       if (fread(&(buf[char_in_buf]), 1, num_to_read, fin) < num_to_read) {
-                               ast_log(LOG_WARNING, "fread() failed: %s\n", strerror(errno));
+                       if (ast_iostream_read(in, &(buf[char_in_buf]), num_to_read) < num_to_read) {
+                               ast_log(LOG_WARNING, "read failed: %s\n", strerror(errno));
                                num_to_read = 0;
                        }
                        contentlen -= num_to_read;
@@ -380,7 +389,7 @@ static int http_post_callback(struct ast_tcptls_session_instance *ser, const str
         */
        ast_http_body_read_status(ser, 0);
 
-       if (0 > readmimefile(ser->f, f, boundary_marker, content_len)) {
+       if (0 > readmimefile(ser->stream, f, boundary_marker, content_len)) {
                ast_debug(1, "Cannot find boundary marker in POST request.\n");
                fclose(f);
                ast_http_error(ser, 400, "Bad Request", "Cannot find boundary marker in POST request.");
@@ -488,7 +497,11 @@ static int reload(void)
 
 static int load_module(void)
 {
-       g_mime_init(0);
+       g_mime_init(
+#ifndef AST_GMIME_VER_30
+                       0
+#endif
+       );
 
        __ast_http_post_load(0);
 
@@ -496,6 +509,7 @@ static int load_module(void)
 }
 
 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "HTTP POST support",
+       .support_level = AST_MODULE_SUPPORT_CORE,
        .load = load_module,
        .unload = unload_module,
        .reload = reload,