Hello

I'm very new to both Apache and libapreq; I'm struggling to get a C
based Apache module working with a multipart/form-data request, which
is uploading 2 files.

Given these 2 parts in my request:

Content-Disposition: form-data; name="foo"; filename="test_file_1.txt"
Content-Type: application/x-thought

and

Content-Disposition: form-data; name="foo"; filename="test_file_2.txt"
Content-Type: application/x-thought


Please could someone advise me what string I should place in the
second parameter in the call to apreq_body_get() ?

I have tried using the actual filename "test_file_1.txt" but I get
returned a NULL pointer from apreq_body_get()
I've also tried using the string "filename" but this also gives me a
NULL pointer.

At the end of this email I've appended the full request from my
client, and the handler from my Apache module.

Thanks in advance for any help or suggestions.

Kind regards,
Mark.



Here is my multipart/form-data request, generated using the libcurl
curl_formadd function - please excuse the output, this is from my test
harness client (I can't figure out how to get Apache to dump the
entire request in it's logs):

12/21/10 21:19:42.402.177 HttpClient.cpp:174 DEBUG   -
=> Send header, 215 bytes (0xd7)
0000: POST /thoughtupload HTTP/1.1
001e: Host: logger1.st3.devel.messagelabs.com
0047: Accept: */*
0054: Content-Length: 402
0069: Expect: 100-continue
007f: Content-Type: multipart/form-data; boundary=--------------------
00bf: --------8691e9ee9b5b
00d5:

12/21/10 21:19:42.403.968 HttpClient.cpp:174 DEBUG   -
<= Recv header, 23 bytes (0x17)
0000: HTTP/1.1 100 Continue

12/21/10 21:19:42.404.326 HttpClient.cpp:174 DEBUG   -
=> Send data, 155 bytes (0x9b)
0000: ------------------------------8691e9ee9b5b
002c: Content-Disposition: form-data; name="foo"; filename="test_file_
006c: 1.txt"
0074: Content-Type: application/x-thought
0099:

12/21/10 21:19:42.404.741 HttpClient.cpp:174 DEBUG   -
=> Send data, 21 bytes (0x15)
0000: This is test file 1..

12/21/10 21:19:42.405.059 HttpClient.cpp:174 DEBUG   -
=> Send data, 157 bytes (0x9d)
0000:
0002: ------------------------------8691e9ee9b5b
002e: Content-Disposition: form-data; name="foo"; filename="test_file_
006e: 2.txt"
0076: Content-Type: application/x-thought
009b:

12/21/10 21:19:42.405.488 HttpClient.cpp:174 DEBUG   -
=> Send data, 21 bytes (0x15)
0000: This is test file 2..

12/21/10 21:19:42.405.740 HttpClient.cpp:174 DEBUG   -
=> Send data, 48 bytes (0x30)
0000:
0002: ------------------------------8691e9ee9b5b--

12/21/10 21:19:42.444.345 HttpClient.cpp:174 DEBUG   -
<= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK


The handler in my Apache module is as follows:

static int thoughtupload_handler(request_rec *r)
{
  if (strcmp(r->handler, "thoughtupload"))
  {
    return DECLINED;
  }

  if(strncmp(r->method, "POST", 4) == 0)
  {
    apreq_handle_t *req;
    req = apreq_handle_apache2(r);

apr_pool_t *mp = NULL;
apr_pool_create(&mp, NULL);
ap_log_rerror(APLOG_MARK, APLOG_EMERG, APR_SUCCESS, r, "I have these
files: %s", apreq_params_as_string(mp, apreq_params(req, mp), NULL,
APREQ_JOIN_AS_IS));
apr_pool_destroy(mp);

    apreq_param_t *param = apreq_body_get(req, "test_file_1.txt");

    if(param == NULL)
    {
ap_log_rerror(APLOG_MARK, APLOG_EMERG, APR_SUCCESS, r, "NO SUCH PARAM");
    }
    else if(param->upload == NULL)
    {
ap_log_rerror(APLOG_MARK, APLOG_EMERG, APR_SUCCESS, r, "NOT UPLOAD");
    }
    else
    {
ap_log_rerror(APLOG_MARK, APLOG_EMERG, APR_SUCCESS, r, "GOT SOME DATA!");
    }
  }

  return OK;
}

Using this code, I get the following log output:

[Tue Dec 21 21:50:16 2010] [emerg] [client 10.191.84.1] I have these
files: test_file_1.txt, test_file_2.txt
[Tue Dec 21 21:50:16 2010] [emerg] [client 10.191.84.1] NO SUCH PARAM

Reply via email to