[Armadillo:02438] Re: [Armadillo-240] CGI でPOSTデータが標準入力されない

河野貴之 email@hidden
2007年 11月 16日 (金) 16:28:22 JST


>POSTはうまく動くはずです。
>
>こちらで試せる、小さな再現プログラムはありますか?
>-- 
>          yashi

下記コードを、"overview_display.c"の void display_overview(void)
の後半に加えてください。

****************************************************

	printf("<div class=\"system_box\">\n");
	printf("<h4>File Upload Test</h4>\n");
	printf("<div>" );
	printf("<form method=\"post\" enctype=\"multipart/form-data\" action=\"http:/admin/fileup.cgi\">" );
	printf("<input type=\"file\" name=\"file_save_data\" size=\"64\" class=\"file\" tabindex=\"1\" />" );
	printf("<input type=\"submit\" name=\"file_save\" value=\"SUBMIT\" tabindex=\"2\" />" );
	printf("</div>" );
	printf("</form>" );

***************************************************

下記コードを"at-cgi/at-cgi/fileup.c"に保存して、
Makefileを修正しMakeしてください。

/*
 * modules/fileup.cgi - system module for at-cgi
 *
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <simple-cgi.h>

#include <misc-utils.h>
#include <system-config.h>
#include <common.h>
#include <core.h>

#include "overview_display.h"

#define ACTION_FILE_SAVE                "file_save"

unsigned char wucRet[3];

char *asciiToHex ( unsigned char hucDat ) {
  unsigned char wucDat;

  wucDat = hucDat >> 4;
  if ( wucDat < 10 ) {
    wucDat += 0x30;
  } else {
    wucDat += 0x37;
  }
  wucRet[0] = wucDat;

  wucDat = hucDat & 0x0f;
  if ( wucDat < 10 ) {
    wucDat += 0x30;
  } else {
    wucDat += 0x37;
  }
  wucRet[1] = wucDat;
  wucRet[2] = 0;
  return wucRet;
}

static int handle_save_request(char *filename)
{
  FILE *fp;
  const char *tmp;
  //  char wstrBoundary[51];
  char wstrTest[20];
  char szInData[1024];
  int  c;
  char user_error_msg_z[] = "Z Request could not be processed";
  char user_error_msg_a[] = "file_save";
  int wintContLen;
  int i;
  unsigned char wucDat;

  at_cgi_debug("handle_save_request\n");

  wintContLen = cgi_get_content_length();
  if ( wintContLen > MAX_QUERY_DATA_SIZE) {
    at_cgi_debug("cgi_get_content_length Error\n");
    return_crit_error("Invalid query",
		      "query content length too big");
    return -1;
  }

  if( ( tmp = getenv("CONTENT_TYPE" ) ) != NULL && 
      ( strstr(tmp, "multipart/form-data") != NULL ) &&
      ( tmp = strstr(tmp, "boundary=") ) != NULL){
    if ( wintContLen != 0 ) {
      for ( i = 0; i < 80; i++ ) {
      	c = fgetc ( stdin );
	    wucDat = ( c >> 24 );
	    at_cgi_debug( asciiToHex ( wucDat ) );
        
	    wucDat = ( c >> 16 ) & 0x000000ff;
	    at_cgi_debug( asciiToHex ( wucDat ) );

        wucDat = ( c >> 8 ) & 0x000000ff;
	    at_cgi_debug( asciiToHex ( wucDat ) );
	
        wucDat = c & 0x000000ff;
	    at_cgi_debug( asciiToHex ( wucDat ) );
      }
    }
  }
  return_crit_error(user_error_msg_a, "No action match");
  return 0;
}

static void handle_local_request()
{
    at_cgi_debug("handle_local_request\n");
    handle_save_request(BT1_FILENAME);
}

int main(int argc, char * argv[])
{
	int ret;

	at_cgi_debug("overview - up and running");

	ret = config_load();
	if (ret < 0) {
 	        at_cgi_debug("config_load Error\n");
		return_crit_error("A required system file could not be loaded",
			"failed to load config");
		exit(EXIT_SUCCESS);
	}

	ret = cgi_query_process();
	if (ret < 0) {
 	        at_cgi_debug("cgi_query_process Error\n");
		return_crit_error("Request could not be processed",
			"Error when processing request arguments");
		exit(EXIT_SUCCESS);
	}

	ret = system_wide_handling();

	if (ret == LOCAL_HANDLING_REQUIRED) {
		handle_local_request();
	} else {
 	        at_cgi_debug("system_wide_handling Error\n");
		return_crit_error("Request could not be processed",
			"Error when processing request arguments");
	}

	config_free();
	cgi_query_free();

	at_cgi_debug("overview - finished");

	exit(EXIT_SUCCESS);
}

***************************************************************

標準入力から、H'ff が読み込まれるはずです。
河野





armadillo メーリングリストの案内