示例#1
0
文件: Receiver.cpp 项目: arcookie/mob
void file_uri_replace(SessionId sessionId, const char * pJoiner, std::string & data)
{
	qcc::String p;
	vRecvFiles::iterator iter;
	size_t start_pos = 0;
	size_t end_pos;

	while ((start_pos = data.find("file://", start_pos)) != std::string::npos) {
		if ((end_pos = data.find("\'", start_pos)) != std::string::npos) {
			if ((iter = std::find_if(gRecvFiles.begin(), gRecvFiles.end(), find_uri(sessionId, pJoiner, data.substr(start_pos, end_pos - start_pos).data()))) != gRecvFiles.end())
				data.replace(start_pos, end_pos - start_pos, get_uri((*iter)->path.data()).data());
		}
		start_pos++;
	}
}
示例#2
0
文件: Receiver.cpp 项目: arcookie/mob
void CSender::SaveFileInfo(SessionId sessionId, const char * pJoiner, const char * sPath, const FILE_SEND_ITEM * pFSI)
{
	if (pFSI) {
		vRecvFiles::iterator _iter;

		if ((_iter = std::find_if(gRecvFiles.begin(), gRecvFiles.end(), find_uri(sessionId, pJoiner, pFSI->uri))) != gRecvFiles.end()) {
			(*_iter)->fsize = pFSI->fsize;
			(*_iter)->mtime = pFSI->mtime;
			(*_iter)->path = sPath;
		}
		else {
			FILE_RECV_ITEM * pFRI = new FILE_RECV_ITEM;

			pFRI->fsize = pFSI->fsize;
			pFRI->mtime = pFSI->mtime;
			pFRI->uri = pFSI->uri;
			pFRI->joiner = pJoiner;
			pFRI->session_id = sessionId;
			pFRI->path = sPath;

			gRecvFiles.push_back(pFRI);
		}
	}
}
示例#3
0
文件: http2.c 项目: Netping/DKSF-70
int http_parse_headers()
{
  char *end;

  // разбор URI
  char *uri = util_scan_caseless(req, " ", req + 6 /* http op max len */, 1);
  if(uri == 0) return 500; // TODO code 501
  char *uri_end = util_scan_caseless(uri, " ", uri + 64 /* max uri len */, 0);
  if(uri_end == 0) return 500; // TODO generate error, too long URI
  *uri_end = 0; // z-term URI
  if(memcmp((unsigned char*)uri, "/", 2) == 0) uri = "/index.html";
  http.page = find_uri(uri);
  if(http.page == 0) return 404;
  *uri_end = ' '; // restore truncated rec data // LBS 27.01.2011

  // выделить аргументы - LBS 5.05.2012
  util_fill((void*)req_args, sizeof req_args, 0);
  char *arg = util_scan_caseless(req, "?", uri_end, 1);
  if(arg != 0)
  {
    unsigned arglen = uri_end - arg;
    if(arglen > sizeof req_args - 1) arglen = sizeof req_args - 1;
    util_cpy((void*)arg, (void*)req_args, arglen);
  }

  // найти начало http заголовков
  char *hdr = util_scan_caseless(uri_end+1, "\r\n", uri_end + 11 /* http version field approx. len + crlf */, 1);
  if(!hdr) return 500;

  // Host // LBS 27.01.2011
  req_host[0] = 0;
  char *host = util_scan_caseless(hdr, "Host:", hdr_end, 1);
  if(host)
  {
    end  = util_scan_caseless(host, "\r\n", hdr_end, 0);
    if(end)
    {
      host = util_skip_lws(host, end);
      unsigned hostlen = end - host;
      if(hostlen < sizeof req_host)
      {
        util_cpy((void*)host, (void*)req_host, hostlen);
        req_host[hostlen] = 0; // z-term
      }
    }
  }
  // CORS Origin // 16.12.2014
  req_origin[0] = 0;
  char *orig = util_scan_caseless(hdr, "Origin:", hdr_end, 1);
  if(orig)
  {
    orig = util_skip_lws(orig, end);
    strlccpy(req_origin, orig, '\r', sizeof req_origin);
  }
  // авторизация
  char *cre = util_scan_caseless(hdr, "Authorization:", hdr_end, 1);
  if(!cre)  return 401;
  end = util_scan_caseless(cre, "\r\n", hdr_end, 0);
  cre = util_scan_caseless(cre, "Basic", end, 1);
  if(!cre) return 401;
  cre = util_skip_lws(cre, end);
  end = util_skip_not_lws(cre, end); //  LWS = [CRLF] 1*( SP | HT )

  char userpass[36], *pass;
  unsigned b64len = end - cre;
  if(b64len > 44) return 401; // limit to 11 letter groups of 4 => up to 33 decoded chars // 13.02.2015
  base64_decode(cre, userpass, sizeof userpass);

  for(pass=userpass; *pass!=':'; ++pass) // scan to passwd
    if(*pass == 0) return 401;
  *pass++ = 0; // replace ':' with 0, point to password
  if(check_user_access(userpass, pass) == 0)  return 401;

  // разбор типа операции
  if(memcmp((void*)req, "GET", 3) == 0 && (http.page->flags & HTML_FLG_GET))
  {
    return 290;
  }
  else if(memcmp(req, "OPTIONS", 7) == 0)
  {
    return 297;
  }
  else if(memcmp((void*)req, "POST", 4) == 0 && (http.page->flags & HTML_FLG_POST))
  {
    char *conlen = util_scan_caseless(hdr, "Content-Length:", hdr_end, 1);
    if(!conlen) return 500;
    conlen = util_skip_lws(conlen, hdr_end);
    end = util_scan_caseless(conlen, "\r\n", hdr_end, 0);
    *end = 0;
    //str_dec_to_data((void*)conlen, (void*)&http.post_content_length, sizeof http.post_content_length);
    http.post_content_length = atoi(conlen); // 13.03.2013 dksf48

    return 291;
  }
  return 500;
}
示例#4
0
文件: Receiver.cpp 项目: arcookie/mob
void CSender::OnRecvData(const InterfaceDescription::Member* /*pMember*/, const char* /*srcPath*/, Message& msg)
{
	uint8_t * data;
	size_t size;
	mTrain::iterator iter;
	const char * pJoiner = msg->GetSender();
	mTrain & train = m_mTrain[pJoiner];
	SessionId sessionId = m_pMob->GetSessionID();

	msg->GetArg(0)->Get("ay", &size, &data);

	if (IS_TRAIN_HEADER(data) && size == sizeof(TRAIN_HEADER)) {
		TRAIN_HEADER * pTH = (TRAIN_HEADER *)data;

		if (pTH->action == ACT_END) OnDataEnd(pTH->footprint, pJoiner);
		else if (pTH->action == ACT_NO_MISSING) m_pMob->SetSignal(pJoiner, false);
		else {
			train[pTH->chain].action = pTH->action;
			train[pTH->chain].footprint = pTH->footprint;
			blkInit(&(train[pTH->chain].body));
			memcpy(train[pTH->chain].extra, pTH->extra, TRAIN_EXTRA_LEN);

			if (pTH->action == ACT_FILE) {
				FILE_SEND_ITEM * pFSI = (FILE_SEND_ITEM *)pTH->extra;

				if (pFSI) {
					qcc::String uri = pFSI->uri;

					train[pTH->chain].path = mem2file(0, 0, uri.substr(uri.find_last_of('.')).data());
				}
			}
		}
	}
	else if ((iter = train.find(((int*)data)[0])) != train.end()){
		if (size == sizeof(int)) {
			switch (iter->second.action) {
			case ACT_SIGNAL:
				MissingCheck(iter->second.body.z);
				blkFree(&(iter->second.body));
				break;
			case ACT_MISSING:
			{
				sqlite3_stmt *pStmt = NULL;
				sqlite3_stmt *pStmt2 = NULL;
				SYNC_DATA sd;

				strcpy_s(sd.joiner, sizeof(sd.joiner), m_pMob->GetJoinName());

				QUERY_SQL_V(m_pMob->GetUndoDB(), pStmt2, ("SELECT num, snum, base_table, redo FROM works WHERE joiner=%Q AND snum IN (%s)", sd.joiner, iter->second.body.z),
					sd.snum = sqlite3_column_int(pStmt2, 1);
					strcpy_s(sd.base_table, sizeof(sd.base_table), (const char *)sqlite3_column_text(pStmt2, 2));
					sd.snum_prev = -1;
					QUERY_SQL_V(m_pMob->GetUndoDB(), pStmt, ("SELECT joiner, snum FROM works WHERE num < %d AND base_table=%Q ORDER BY num DESC LIMIT 1", sqlite3_column_int(pStmt2, 0), sd.base_table),
						strcpy_s(sd.joiner_prev, sizeof(sd.joiner_prev), (const char *)sqlite3_column_text(pStmt, 0));
						sd.snum_prev = sqlite3_column_int(pStmt, 1);
						break;
					);
					alljoyn_send(sessionId, msg->GetSender(), ACT_DATA, (char *)sqlite3_column_text(pStmt2, 3), sqlite3_column_bytes(pStmt2, 3) + 1, (const char *)&sd, sizeof(SYNC_DATA));
				);
				blkFree(&(iter->second.body));
				break;
			}
			case ACT_DATA:
			{
				TRAIN & cargo = m_mStation[pJoiner][iter->second.footprint];
				cargo.action = iter->second.action;
				blkMove(&(cargo.body), &(iter->second.body));
				memcpy(cargo.extra, iter->second.extra, TRAIN_EXTRA_LEN);
				break;
			}
			case ACT_FLIST:
				if (sizeof(FILE_SEND_ITEM) % iter->second.body.nUsed == 0) {
					int n = 0;
					Block data;
					vRecvFiles::iterator _iter;
					FILE_SEND_ITEM * pFSI = (FILE_SEND_ITEM *)iter->second.body.z;

					blkInit(&data);

					while (n < iter->second.body.nUsed) {
						if ((_iter = std::find_if(gRecvFiles.begin(), gRecvFiles.end(), find_uri(sessionId, msg->GetSender(), pFSI->uri))) == gRecvFiles.end() ||
							(*_iter)->mtime != pFSI->mtime || (*_iter)->mtime != pFSI->mtime)
							mem2mem(&data, (char *)pFSI, sizeof(FILE_SEND_ITEM));

						n += sizeof(FILE_SEND_ITEM);
						pFSI++;
					}
					if (data.nUsed > 0) SendData(pJoiner, iter->second.footprint, ACT_FLIST_REQ, sessionId, data.z, data.nUsed); // special target most be assigned.
					else OnDataEnd(iter->second.footprint, pJoiner);

					blkFree(&data);
					blkFree(&(iter->second.body));
				}
				break;
			case ACT_FLIST_REQ:
				if (sizeof(FILE_SEND_ITEM) % iter->second.body.nUsed == 0) {
					int n = 0;
					FILE_SEND_ITEM * pFSI = (FILE_SEND_ITEM *)iter->second.body.z;

					while (n < iter->second.body.nUsed) {
						SendFile(pJoiner, iter->second.footprint, ACT_FILE, sessionId, pFSI);
						n += sizeof(FILE_SEND_ITEM);
						pFSI++;
					}
					SendData(pJoiner, iter->second.footprint, ACT_END, sessionId, 0, 0);// special target most be assigned.
				}
				blkFree(&(iter->second.body));
				break;
			case ACT_FILE:
				SaveFileInfo(sessionId, pJoiner, iter->second.path.data(), (FILE_SEND_ITEM *)iter->second.extra);
				break;
			default:
				blkFree(&(iter->second.body));
				break;
			}
			train.erase(iter);
		}