コード例 #1
0
ファイル: request.c プロジェクト: Dream74/Web_Server
int ex_send_file(ExHttp *pHttp, const char *filePath)
{
  char buf[BUFSIZ] ;
  char *pBuf = buf ;
  int ret = 0 ;
  pBuf += codeSet( pBuf, 200 ) ;
  pHttp->url = ( char * ) filePath ;
  stat( filePath, &pHttp->st ) ;
  pBuf += fileSet( pBuf, pHttp ) ;
  do {
    if ( (ret = sendHead( pHttp, buf, pBuf-buf ))<0 )
      break ;

    if ( (ret = sendFileStream( pHttp, filePath ))<0 )
      break ;
  } while ( 0 ) ;
  return ret ;
}
コード例 #2
0
ファイル: request.c プロジェクト: keenhenry/eserv
static int staticProcess(const ExHttp *pHttp)
{
	char buf[BUFSIZ];
	char *pBuf = buf;
	int ret = 0;

	int code = cacheCheck(pHttp);
	pBuf += codeSet(pBuf , code);
	if (code == 200) {
		pBuf += fileSet(pBuf , pHttp);
		pBuf += connectionSet(pBuf);
	}
	do {
		if ((ret = sendHead(pHttp, buf , pBuf - buf)) < 0)
			break;

		if (code == 304 || 'H' == *(pHttp->method))
			break;
		ret = sendFileStream(pHttp, pHttp->url);
	} while (0);
	return ret;
}
コード例 #3
0
ファイル: MainWindow.cpp プロジェクト: psychogenic/druid
bool MainWindow::executeCommand(const DRUIDString & command)
{
	static const wxString runStatus(wxT("Executing command"));
	static const wxString inputRequired(wxT("Input Required..."));
	static const wxString integerInputRequired(wxT("Integer input Required..."));
	static const wxString numericInputRequired(wxT("Numeric input Required..."));
	static const wxString runStatusDone(wxT(" completed"));

	SetStatusText(runStatus);


	uint8_t wait_attempts=0;
	while (executing_request && wait_attempts++ < 5)
		usleep(1000);


	touchLastInteraction();
	DRUID::SerialUIUserPtr serial_user = connection->serialUser();


	DRUID_DEBUG2("Doing send+rcv for", command);

	executing_request = true;
	if ( (! serial_user->sendAndReceive(command)) || serial_user->hasError())
	{
		wxString errMsg(DRUID_STDSTRING_TOWX(serial_user->errorMessage()));

		SetStatusText(errMsg);
		MW_RETURNFROM_EXECUTECOMMAND(false);

	}

	awaiting_input = false;

	wxString cmdName(DRUID_STDSTRING_TOWX(command));
	if (serial_user->inputRequired())
	{

		serial_user->flushReceiveBuffer();
		serial_user->setAutoReplaceLastMessage(false);

		{ // may have more than a single input to enter, so we do/while it...

			DRUID_DEBUG("Need input...");
			oldFocus = this->FindFocus();
			awaiting_input = true;
			DRUID::UserInputType reqType = serial_user->inputRequiredType();

			// get the name from the prompt, if possible.
			if (serial_user->inputRequiredPromptString().size()) {
				cmdName =
						DRUID_STDSTRING_TOWX(serial_user->inputRequiredPromptString());
			}

			bool streamSuccess;
			switch (reqType) {
			case DRUID::InputType_Numeric:
				DRUID_DEBUG("Numeric input required");
				SetStatusText(numericInputRequired);
				break;

			case DRUID::InputType_Integer:
				DRUID_DEBUG("Numeric (int) input required");
				SetStatusText(integerInputRequired);
				break;

			case DRUID::InputType_Stream:

				DRUID_DEBUG("Want a stream (file) upload");

				// little bit different, this one... we need to select a file and stream its contents in...

				streamSuccess = sendFileStream();
				// outputTextCtrl->AppendText(DRUID_STDSTRING_TOWX(serial_user->lastMessage()));

				awaiting_input = false;
				MW_RETURNFROM_EXECUTECOMMAND(streamSuccess);
				break;

			default:
				DRUID_DEBUG("String input required");
				SetStatusText(inputRequired);
				break;

			}


			input->acceptInput(true, cmdName, reqType);


		}

	} else {

		wxString stat(cmdName);
		stat += runStatusDone;
		SetStatusText(stat);
		if (serial_user->messageReceived())
		{
			outputTextCtrl->AppendText(DRUID_STDSTRING_TOWX(serial_user->lastMessage()));

			serial_user->lastMessageClear();
		}


		serial_user->setAutoReplaceLastMessage(true);

		if (serial_user->requestedTerminate())
		{

			SetStatusText(wxT("GUI Termination requested"));

			// TODO: FIXME -- show user we aren't just dying but terminating on purpose.
			doQuit();

			MW_RETURNFROM_EXECUTECOMMAND(true);

		}


		if (useStateTracking() && serial_user->numTrackedVariables())
		{
			last_interaction = 0;
		}

	}


	MW_RETURNFROM_EXECUTECOMMAND(true);


}
コード例 #4
0
ファイル: request.c プロジェクト: Dream74/Web_Server
static int staticProcess(const ExHttp *pHttp)
{
  char buf[BUFSIZ] ;
  char *pBuf = buf ;
  int ret = 0 ;

  int code = cacheCheck( pHttp ) ;
  pBuf += codeSet( pBuf, code ) ;
  if ( code==200 ) {
    pBuf += fileSet( pBuf, pHttp ) ;
  }

  if ( strcmp( get_mime_type( pHttp->url ), "image/png" )!=0 )
    pBuf += setCookie( pBuf, pHttp ) ;

  do {
    if ( code==206 ) {
      char rangeTemp[128] ;
      char * range = ( char * ) get_head_info( pHttp, "Range" ) ;
      strncpy( ( char * ) &rangeTemp, range, 128 ) ;
      range = ( char * ) &rangeTemp ;
      SKIP( &range, '=' ) ;
      char * sRange = range ;
      SKIP( &range, '-' ) ;

      char date[35] ;
      strftime( date, 35, "%a, %d %b %Y %X GMT", localtime( &(pHttp->st.st_ctime) ) ) ;

      int startRange = (*sRange=='\0') ? -1 : atoi( sRange ) ;
      int endRange = (*range=='\0') ? -1 : atoi( range ) ;
			// printf("start :%d end :%d\n",startRange,endRange ) ;
      if ( startRange<0 ) {
        startRange = pHttp->st.st_size-endRange ;
        endRange = pHttp->st.st_size ;
      }
      else if ( endRange<0 ) {
        endRange = pHttp->st.st_size ;
      }
      pBuf += sprintf( pBuf, "connection: close\n"
              "Last-Modified: %s\n"
              "Accept-Ranges: bytes\n"
              "Content-Length: %d\n"
              "Content-Range: bytes %d-%d/%d\n",
              date,
              endRange-startRange,
              startRange,
              endRange,
              pHttp->st.st_size
              ) ;
      if ( (ret = sendHead( pHttp, buf, pBuf-buf ))<0 )
        break ;
      ret = sendFileRangeStream( pHttp, pHttp->url, startRange, endRange + 1 ) ;
      break ;
    }

    if ( (ret = sendHead( pHttp, buf, pBuf-buf ))<0 )
      break ;

    if ( code==304|| code == 412 || 'H'== *(pHttp->method) )
      break ;
    ret = sendFileStream( pHttp, pHttp->url ) ;
  } while ( 0 ) ;
  return ret ;
}