Search code examples
javaandroidhttp-request

Parse http request server side using http components


HI I am teaching myself android development.To start with, I have implemented a webserver on android using apache http utils, which serves a login page when browsed to localhost:8080 on emulator.

I would like to know how can I parse the login request on android server side .This web server serves content on the fly based on the Uri requested.Say when the login page is submitted the form is posted to /login.do, on the localhost:8080.

I have registered a handler for that action as shown below.I was wondering if there is a way to parse the request body in my handler and serve the html accordingly.I have only one field in the form to parse namely password.I could get only as far as reading the request headers.

Any ideas or pointers in the right direction would be greatly appreciated.Thanks

import java.io.BufferedInputStream;  
import java.io.ByteArrayOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.io.OutputStreamWriter;  

import org.apache.http.HeaderElement;  
import org.apache.http.HeaderElementIterator;  
import org.apache.http.HttpEntity;  
import org.apache.http.HttpException;  
import org.apache.http.HttpRequest;  
import org.apache.http.HttpResponse;  
import org.apache.http.NameValuePair;  
import org.apache.http.entity.ContentProducer;  
import org.apache.http.entity.EntityTemplate;  
import org.apache.http.message.BasicHeaderElementIterator;  
import org.apache.http.protocol.HttpContext;  
import org.apache.http.protocol.HttpRequestHandler;  

import android.content.Context;  

public class LoginHandler implements HttpRequestHandler {  
    private Context context = null;  
    String req;  
    public LoginHandler(Context context) {  
        this.context = context;  
    }  

    @Override  
    public void handle( final HttpRequest request, HttpResponse response,  
            HttpContext httpcontext) throws HttpException, IOException {  
        HttpEntity entity = new EntityTemplate(new ContentProducer() {  
            public void writeTo(final OutputStream outstream ) throws IOException {  
                String resp;  

            OutputStreamWriter writer = new OutputStreamWriter(outstream, "UTF-8");     
            HeaderIterator it = request.headerIterator();
            while (it.hasNext())
            {
                System.out.println(it.next());
            }
                if (validateUser()==true)  
                    resp = "<html><head></head><body><h1>Home<h1><p>Success."+req+"</p></body></html>";  

                else{  
                    resp="<html><head></head><body><h1>Home<h1><p>Login Failed.</p></body></html>";}  
                writer.write(resp);  
                writer.flush();  
            }  


        });  
        response.setHeader("Content-Type", "text/html");  
        response.setEntity(entity);  

    }  
    boolean validateUser(){  
        boolean valid=false;  
        //if valid  valid=true else valid=false  
        return valid;  
    }  



}  

The output is as follows:

    08-15 15:54:22.112: I/Process(650): Sending signal. PID: 650 SIG: 9
08-15 15:54:27.532: I/HTTPSERVICE(662): Creating and starting httpService
08-15 15:54:27.542: I/Notification(662): Notification Shown
08-15 16:08:19.332: I/HTTPSERVICE(662): Destroying httpService
08-15 16:08:19.352: I/Notification(662): Notification Destroyed
08-15 16:20:14.852: I/HTTPSERVICE(690): Creating and starting httpService
08-15 16:20:14.862: I/Notification(690): Notification Shown
08-15 16:20:28.102: D/dalvikvm(690): GC freed 2292 objects / 135976 bytes in 157ms
08-15 16:20:28.872: I/Resources(690): Loaded time zone names for en_US in 3090ms.
08-15 16:20:28.882: I/global(690): Default buffer size used in BufferedReader constructor.     It would be better to be explicit if an 8k-char buffer is required.
08-15 16:20:35.302: I/System.out(690): Host: localhost:8080
08-15 16:20:35.382: I/System.out(690): Accept-Encoding: gzip
08-15 16:20:35.422: I/System.out(690): Referer: http://localhost:8080/
08-15 16:20:35.422: I/System.out(690): Accept-Language: en-US
08-15 16:20:35.442: I/System.out(690): User-Agent: Mozilla/5.0 (Linux; U; Android  2.1-update1; en-us; sdk Build/ECLAIR) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17
08-15 16:20:35.472: I/System.out(690): Origin: http://localhost:8080
08-15 16:20:35.512: I/System.out(690): Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
08-15 16:20:35.533: I/System.out(690): Content-Type: application/x-www-form-urlencoded
08-15 16:20:35.562: I/System.out(690): Accept-Charset: utf-8, iso-8859-1,utf-16,*;q=0.7
08-15 16:20:35.599: I/System.out(690): Content-Length: 25

I could not find any resource applicable to my case on the apache site.Is is possible to read the requestbody directly from the url?


Solution

  • After looking around for ages I found the solution. Adding the following in the handle method does the trick.Thanks to the original poster.http://www.androiddevblog.net/android/a-bare-minimum-web-server-for-android-platform

                if (request instanceof HttpEntityEnclosingRequest) {
        HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
        if (entity != null) {
        Log.v("RequestBody", EntityUtils.toString(entity, "UTF-8"));
        entity.consumeContent();
        }
        }