Esempio n. 1
0
static Octstr  *mm7http_send(MmscGrp *mmc, Octstr *from, Octstr *to,
			     MmsMsg *m, Octstr **error,
			     int *retry)
{
     Octstr *ret = NULL;
     int mtype = mms_messagetype(m);
     int hstatus = HTTP_OK;
     List *rh, *ph = NULL;
     Octstr *body = NULL, *rbody = NULL; 
     Octstr *mms;
     MIMEEntity *form_data = make_multipart_formdata();
     
     mms_info(0, "MM7", mmc->id,  "MMSBox: Send [http] to MMC[%s], msg type [%s], from %s, to %s", 
	  mmc ? octstr_get_cstr(mmc->id) : "", 
	  mms_message_type_to_cstr(mtype), 
	  octstr_get_cstr(from), octstr_get_cstr(to));

     mms = mms_tobinary(m);
     
     add_multipart_form_field(form_data, "to", "text/plain", NULL, to);
     add_multipart_form_field(form_data, "from", "text/plain", NULL, from);
     add_multipart_form_field(form_data, "mms", "application/vnd.wap.mms-message", NULL, mms);

     
     rh = mime_entity_headers(form_data);
     body = mime_entity_body(form_data);

     hstatus = mmsbox_url_fetch_content(HTTP_METHOD_POST, mmc->mmsc_url, rh, body, &ph, &rbody);

     if (http_status_class(hstatus) != HTTP_STATUS_SUCCESSFUL) {
	  *error = octstr_format("Failed to contact MMC[url=%S] => HTTP returned status = %d !",
				 mmc->mmsc_url, hstatus);
     } else {
	  ret = rbody ? octstr_duplicate(rbody) : NULL;
	  if (ret)
	       octstr_strip_blanks(ret);
     }
     
     *retry = (ret == NULL && (http_status_class(hstatus) == HTTP_STATUS_SERVER_ERROR || hstatus < 0));

     if (ret)
	  mms_log2("Sent", from, to, -1, ret, NULL, mmc->id, "MMSBox", NULL, NULL);

     http_destroy_headers(rh);
     octstr_destroy(body);
     http_destroy_headers(ph);
     octstr_destroy(rbody);
     octstr_destroy(mms);
     mime_entity_destroy(form_data);
     
     return ret;
}
Esempio n. 2
0
int operate_single_mime(Octstr *p_psoHdrs, MIMEEntity *p_psoMIME, const char *p_pszWebDir)
{
  int iRetVal = 0;
  Octstr *psoHdrName = NULL, *psoHdrValue = NULL;
  Octstr *psoMIMEOStr = NULL, *psoFileName = NULL;
  List *psoHdrList = NULL;
  int iFile = -1;

  if(psoMIMEOStr) {
    octstr_destroy(psoMIMEOStr);
  }
  /* выбираем необходимые заголовки */
  psoHdrList = mime_entity_headers(p_psoMIME);
  /* Content-type */
  psoHdrName = octstr_create("Content-type");
  psoHdrValue = http_header_value(psoHdrList, psoHdrName);
  if(0 == strncasecmp("application/smil", octstr_get_cstr(psoHdrValue), 16)) {
    goto done;
  }
  octstr_format_append(p_psoHdrs, "\r\n");
  octstr_format_append(p_psoHdrs, "\r\n%S;%S", psoHdrName, psoHdrValue);
  octstr_truncate(psoHdrName, 0);
  /* Content-location */
  octstr_append_cstr(psoHdrName, "Content-location");
  psoHdrValue = http_header_value(psoHdrList, psoHdrName);
  octstr_format_append(p_psoHdrs, "\r\n%S;%S", psoHdrName, psoHdrValue);
  octstr_truncate(psoHdrName, 0);
  /**/

  /* формируем имя файла */
  psoFileName = octstr_create(p_pszWebDir);
  if('/' != octstr_get_char(psoFileName, octstr_len(psoFileName) - 1)) {
    octstr_append_char(psoFileName, '/');
  }
  octstr_append(psoFileName, psoHdrValue);
  /* создаем файл */
  iFile = open(octstr_get_cstr(psoFileName), O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
  if(0 > iFile) {
    if(errno != EEXIST) {
      iRetVal = 7;
      goto done;
    }
  }
  psoMIMEOStr = mime_entity_body(p_psoMIME);
  octstr_base64_to_binary(psoMIMEOStr);
  if(octstr_len(psoMIMEOStr) != write(iFile, octstr_get_cstr(psoMIMEOStr), octstr_len(psoMIMEOStr))) {
    iRetVal = 8;
    goto done;
  }

  done:
  if(psoHdrName) {
    octstr_destroy(psoHdrName);
  }
  if(psoFileName) {
    octstr_destroy(psoFileName);
  }
  if(0 < iFile) {
    close(iFile);
  }

  return iRetVal;
}