public void encode()

in client/src/main/java/org/apache/ahc/codec/HttpRequestEncoder.java [86:193]


    public void encode(IoSession ioSession, Object message, ProtocolEncoderOutput out) throws Exception {
        HttpRequestMessage msg = (HttpRequestMessage)message;

        IoBuffer buf = IoBuffer.allocate(1024, false);

        // Enable auto-expand for easier encoding
        buf.setAutoExpand(true);

        try {
            //If we have content, lets create the query string
            int attrCount = msg.getParameters().size();
            String urlAttrs = "";
            if (attrCount > 0) {
                NameValuePair attrs[] = new NameValuePair[attrCount];
                Set<Map.Entry<String, String>> set = msg.getParameters().entrySet();
                int i = 0;
                for (Map.Entry<String, String> entry : set) {
                    attrs[i++] = new NameValuePair(entry.getKey(), entry.getValue());
                }
                urlAttrs = EncodingUtil.formUrlEncode(attrs, msg.getUrlEncodingCharset());
            }

            CharsetEncoder encoder = Charset.forName(HttpMessage.HTTP_ELEMENT_CHARSET).newEncoder();
            buf.putString(msg.getRequestMethod().name(), encoder);
            buf.putString(" ", encoder);
            if (HttpMethod.CONNECT == msg.getRequestMethod()) {
                buf.putString(msg.getHost(), encoder);
                buf.putString(":", encoder);
                buf.putString(msg.getPort() + "", encoder);
            } else {
                if (msg.isProxyEnabled() && !msg.getProtocol().toLowerCase().equals("https")) {
                    buf.putString(msg.getUrl().toString(), encoder);
                } else {
                    buf.putString(msg.getUrl().getFile(), encoder);
                }
            //If its a GET, append the attributes
            if (HttpMethod.GET == msg.getRequestMethod() && attrCount > 0) {
                //If there is not already a ? in the query, append one, otherwise append a &
                    if (!msg.getUrl().getFile().contains("?")) {
                    buf.putString("?", encoder);
                } else {
                    buf.putString("&", encoder);
                }
                buf.putString(urlAttrs, encoder);
            }
            }
            buf.putString(" HTTP/1.1", encoder);
            buf.put(CRLF);

            //This header is required for HTTP/1.1
            buf.putString("Host: ", encoder);
            buf.putString(msg.getHost(), encoder);
            if ((msg.getProtocol().equals("http") && msg.getPort() != 80)
                || (msg.getProtocol().equals("https") && msg.getPort() != 443)) {
                buf.putString(":", encoder);
                buf.putString(msg.getPort() + "", encoder);
            }
            buf.put(CRLF);

            //User agent
            if (msg.getUserAgent() != null) {
                buf.putString("User-Agent: ", encoder);
                buf.putString(msg.getUserAgent(), encoder);
                buf.put(CRLF);
            }

            //Process any headers we have
            processHeaders(msg, buf, encoder);

            //Process cookies
            //NOTE: I am just passing the name value pairs and not doing management of the expiration or path
            //As that will be left up to the user.  A possible enhancement is to make use of a CookieManager
            //to handle these issues for the request
            processCookies(msg, buf, encoder);

            //If this is a POST, then we need a content length and type
            if (HttpMethod.POST == msg.getRequestMethod()) {
                byte content[] = urlAttrs.getBytes();

                //Type
                buf.putString(HttpMessage.CONTENT_TYPE, encoder);
                buf.putString(": ", encoder);
                buf.putString(POST_CONTENT_TYPE, encoder);
                buf.put(CRLF);

                //Length
                buf.putString(HttpMessage.CONTENT_LENGTH, encoder);
                buf.putString(": ", encoder);
                buf.putString(content.length + "", encoder);
                buf.put(CRLF);
                //Blank line
                buf.put(CRLF);
                buf.put(content);
            } else {
                //Blank line
                buf.put(CRLF);
            }

        } catch (CharacterCodingException ex) {
            ex.printStackTrace();
        }

        buf.flip();

        out.write(buf);
        out.flush();

    }