com.subgraph.vega.ui.httpeditor.parser.HttpRequestParser.java Source code

Java tutorial

Introduction

Here is the source code for com.subgraph.vega.ui.httpeditor.parser.HttpRequestParser.java

Source

/*******************************************************************************
 * Copyright (c) 2011 Subgraph.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Subgraph - initial API and implementation
 ******************************************************************************/
package com.subgraph.vega.ui.httpeditor.parser;

import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.http.ParseException;
import org.apache.http.ProtocolVersion;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicLineParser;
import org.apache.http.message.LineParser;
import org.apache.http.message.ParserCursor;
import org.apache.http.util.CharArrayBuffer;

import com.subgraph.vega.api.http.requests.IHttpRequestBuilder;
import com.subgraph.vega.api.http.requests.IHttpRequestEngine;

/**
 * Parser to parse user-entered requests into an IHttpRequestBuilder.
 */
public class HttpRequestParser extends ParserBase {
    private final IHttpRequestBuilder builder;
    private final boolean parseInlineEntities;

    public HttpRequestParser(final IHttpRequestBuilder builder, boolean parseInlineEntities) {
        this.builder = builder;
        this.parseInlineEntities = parseInlineEntities;
    }

    public HttpRequestParser(final IHttpRequestBuilder builder) {
        this(builder, true);
    }

    public HttpRequestParser(IHttpRequestEngine requestEngine) {
        this(requestEngine.createRequestBuilder(), true);
    }

    /**
     * Parse a manually-entered HTTP request into the IHttpRequestBuilder.
     * 
     * @param content Manually-entered HTTP request.
     */
    public void parseRequest(final String content) throws URISyntaxException, UnsupportedEncodingException {
        final CharArrayBuffer buf = new CharArrayBuffer(0);
        buf.append(content);
        final ParserCursor bufCursor = new ParserCursor(0, buf.length());
        final LineParser parser = new BasicLineParser();

        if (parseRequestLine(parser, builder, buf, bufCursor) < 0) {
            return;
        }
        builder.clearHeaders();
        parseHeaders(parser, builder, buf, bufCursor);
        if (!bufCursor.atEnd() && parseInlineEntities) {
            StringEntity entity = new StringEntity(buf.substring(bufCursor.getPos(), bufCursor.getUpperBound()));
            builder.setEntity(entity);
        }
    }

    public IHttpRequestBuilder getRequestBuilder() {
        return builder;
    }

    /**
     * Read and parse the request line.
     * 
     * @param parser HC LineParser.
     * @param builder HTTP request builder.
     * @param buf
     * @param bufCursor
     * @return
     * @throws URISyntaxException
     */
    private int parseRequestLine(final LineParser parser, final IHttpRequestBuilder builder,
            final CharArrayBuffer buf, final ParserCursor bufCursor) throws URISyntaxException {
        final CharArrayBuffer lnBuf = new CharArrayBuffer(0);
        if (readLine(buf, bufCursor, lnBuf) < 1) {
            // no data! 
            return -1;
        }
        final ParserCursor lnCursor = new ParserCursor(0, lnBuf.length());

        String method, uri;
        ProtocolVersion version;
        if ((method = nextWord(lnBuf, lnCursor)) != null) {
            if ((uri = nextWord(lnBuf, lnCursor)) != null) {
                try {
                    version = parser.parseProtocolVersion(lnBuf, lnCursor);
                } catch (ParseException e) {
                    // treat the unparseable version as HTTP/1.1
                    version = new ProtocolVersion("HTTP", 1, 1);
                }
                ;
            } else {
                uri = "";
                version = null;//new ProtocolVersion("HTTP", 0, 9);
            }
        } else {
            method = lnBuf.toString();
            uri = "";
            version = null;//new ProtocolVersion("HTTP", 0, 9);
        }

        builder.setMethod(method);
        builder.setFromUri(new URI(uri));
        builder.setProtocolVersion(version);

        return 0;
    }

}