- From: olga <olga@goliath.eai.com>
- Date: Thu, 11 Mar 1999 10:07:37 -0600 (CST)
- To: Gert Koning <koningj@sol1.unisa.ac.za>
- Cc: www-lib@w3.org
Hi Gert, There are my functions to do this. Probably some of the parts are not needed. The multipatrt data are already combined in the file "local_filename". BOOL Lib_s::postURL(const char* server/* where to post */, int port, const char* url /* url of the script on server */, const char* local_filename /* name of file (muilipart data) to post */) { HTParentAnchor * src = NULL; HTAnchor * dst = NULL; HTCacheMode_setEnabled(NO); HTRequest * request = HTRequest_new(); HTRequest_setRealm (request, "myNetwork"); // this is a mess with the headers but it works this way so I am not // touching that. //#define DEFAULT_REQUEST_HEADERS HTRequest_setRqHd(request, HT_C_ACCEPT_CHAR); HTRequest_addRqHd(request, HT_C_ACCEPT_ENC); HTRequest_addRqHd(request, HT_C_ACCEPT_LAN); HTRequest_addRqHd(request, HT_C_AUTH); HTRequest_addRqHd(request, HT_C_EXPECT); HTRequest_addRqHd(request, HT_C_HOST); HTRequest_addRqHd(request, HT_C_REFERER); HTRequest_addRqHd(request, HT_C_USER_AGENT); //request's entity headers HTRequest_setEnHd(request, HT_E_ALLOW); HTRequest_addEnHd(request, HT_E_CONTENT_BASE); HTRequest_addEnHd(request, HT_E_CONTENT_LENGTH); HTRequest_addEnHd(request, HT_E_CONTENT_LOCATION); HTRequest_addEnHd(request, HT_E_CTE); HTRequest_addEnHd(request, HT_E_DERIVED_FROM); HTRequest_addEnHd(request, HT_E_ETAG); HTRequest_addEnHd(request, HT_E_TITLE); HTRequest_addEnHd(request, HT_E_URI); HTRequest_addEnHd(request, HT_E_VERSION); char dest[2048]; sprintf(dest, "http://%s:%d/%s", server, port, url); #ifdef EAI_DBG cerr << "\n------- postURL: destination = " << dest << endl; #endif char buf[520]; long myFileSize = sizeOfFile(local_filename); //Read source file into memory FILE * in = fopen(local_filename, "r"); if (!in) return NO; // now write file to the chunk.. int n = 0; #ifdef EAI_DBG cerr << "\n------- postURL: file length = " << myFileSize << endl; #endif // char * data = (char *) malloc(myFileSize * (sizeof(char)) + 1); char * data = new char[myFileSize + 1]; if (!data) { #ifdef EAI_DBG cerr << "\n------- postURL: Cannot allocate requered lenght" << endl; #endif return NO; } char * ptr = data; long len = 0; while ((n = fread(buf, sizeof(char), 512, in)) > 0) { memcpy((void *) ptr, (void *) buf, n); ptr = ptr + n; len += n; } #ifdef EAI_DBG cerr << "\n------- postURL: data length = " << len << endl; #endif /* Get an anchor object for the destination URI */ dst = HTAnchor_findAddress(dest); src = HTTmpAnchor(NULL); //src = HTParentAchor_new(); HTAnchor_setDocument(src, data); HTAnchor_setFormat(src, WWW_SOURCE); HTAnchor_setLength(src, len); #ifdef EAI_DBG cerr << "\n------- postURL: data length = " << len << endl; #endif //Set additional headers - add header generator BOOL override; HTList * generators = HTRequest_generator(request, &override); if (! generators) generators = HTList_new(); HTGenerator_add(generators, post_header_gen); HTRequest_setGenerator(request, generators, NO); //??? YES - NO FILE * fp1 = NULL; /* If replace then open the file */ if ((fp1 = fopen("/var/tmp/post_response.txt", "wb")) == NULL) { return NO; } /* Set the output stream and start the request */ HTRequest_setOutputFormat(request, WWW_SOURCE); HTRequest_setOutputStream(request, HTFWriter_new(request, fp1, NO)); // Add Authentication after-filter HTRequest_addAfter(request, HTAuthFilter, NULL, NULL, HT_NO_ACCESS /*| HT_ERROR | HT_NO_DATA*/, HT_FILTER_MIDDLE, NO); // Add custom after-filter HTRequest_addAfter(request, post_terminate_callback, NULL, NULL, HT_ALL /*| HT_ERROR | HT_NO_DATA*/, HT_FILTER_MIDDLE, NO); // this common for all requests filter will clean up and start next request HTRequest_addAfter(request, terminate_handler, NULL, NULL, HT_ALL, HT_FILTER_LAST, NO); HTTP_setBodyWriteDelay(21, 30); // start POST request BOOL st = HTPostAnchor(src, dst, request); return st; } //////////////////////////////////////////////////////// post_header_gen // // Generates additional headers for POST request // int post_header_gen (HTRequest * request, HTStream * stream) { sprintf(headers, "%s%c%c", headers, CR, LF); #ifdef EAI_DBG cerr << "\n======== post_header_gen: headers = " << headers << endl; #endif (*stream->isa->put_block)(stream, headers, strlen(headers)); return HT_OK; } ////////////////////////////////////////////////////////////// // post_terminate_callback // // Local after filter - registered by postURL for POST requests only // Sends results of POST to client int Lib_s::post_terminate_callback (HTRequest * request, HTResponse * response, void * param, int status) { if (status == HT_NO_ACCESS) // Auth required - handled by another filter return HT_OK; HTCacheMode_setEnabled(YES); // replace the global realm guess with the latest realm const char * new_realm = HTRequest_realm(request); if (new_realm) strcpy(realm, new_realm); HTParentAnchor * src = HTRequest_entityAnchor(request); char * ent_data = (char *) HTAnchor_document(src); delete [] ent_data; HTAnchor_setDocument(src, NULL); FILE * in = fopen("/var/tmp/post_response.txt", "r"); if (!in) { char temp[30]; sprintf (temp, "error %d %d", status, EAIErrCode); // Answer client is the function that sends info back to client // throuch the socket AnswerClient("temp", strlen(temp)); remove("/var/tmp/post_response.txt"); return HT_OK; } int n = 0; char data[2048]; char temp[2048]; memset(data, 0, 2048); memset(temp, 0, 2048); //char * ptr = data; int len = 0; char buf[520]; // read data from file to memory while ((n = fread(buf, sizeof(char), 512, in)) > 0) { strncpy(data, buf, n); len += n; } data[len] = '\0'; //int strSize = strlen(data) + 10; #ifdef EAI_DBG cerr << "--- data = " << data << endl << "--- len = " << len << endl; #endif // EAIErrCode is my global var sprintf(temp, "%d %d %d %s", status, EAIErrCode, len, data); #ifdef EAI_DBG cerr << "Sending to client: answer = " << temp << endl; #endif AnswerClient(temp, strlen(temp)); remove("/var/tmp/post_response.txt"); return HT_OK; } //////////////////////////////////////////////// Hope this helps, Olga Antropova. On 11-Mar-99 Gert Koning wrote: > Hi there libwww'ers > > How can I POST with multipart/form-data and get the result in a memory > chunk? In other words, I need a function like HTPostFormAnchorToChunk(), but > in stead of taking an HTAssocList it should take my multipart/form-data > somehow. > > Thanks, > Gert Koning > University of South Africa ---------------------------------- E-Mail: olga <olga@eai.com> Date: 11-Mar-99 Time: 09:52:59 This message was sent by XFMail ----------------------------------
Received on Thursday, 11 March 1999 11:03:42 UTC