[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 メーリングリストの案内