Ejemplo n.º 1
0
EString EHttpProxyRequest::toHttpString() {
    EString sb;

    sb.append(getHttpVerb()).append(' ').append(getHttpURI()).append(' ').append(getHttpVersion())
    .append(EHttpProxyConstants_CRLF);

    boolean hostHeaderFound = false;

    if (getHeaders() != null) {
        sp<EIterator<EMapEntry<EString*, EList<EString*>*>*> > iter = getHeaders()->entrySet()->iterator();
        while (iter->hasNext()) {
            EMapEntry<EString*, EList<EString*>*>* header = iter->next();
            if (!hostHeaderFound) {
                hostHeaderFound = header->getKey()->equalsIgnoreCase("host");
            }

            EList<EString*>* values = header->getValue();
            if (values) {
                sp<EIterator<EString*> > iter2 = values->iterator();
                while (iter2->hasNext()) {
                    sb.append(header->getKey()->c_str()).append(": ").append(iter2->next()).append(EHttpProxyConstants_CRLF);
                }
            }
        }

        if (!hostHeaderFound && (eso_strcmp(getHttpVersion(), EHttpProxyConstants_HTTP_1_1) == 0)) {
            sb.append("Host: ").append(getHost()).append(EHttpProxyConstants_CRLF);
        }
    }

    sb.append(EHttpProxyConstants_CRLF);

    return sb;
}
Ejemplo n.º 2
0
EHttpProxyResponse::EHttpProxyResponse(const char* httpVersion,
		const char* statusLine, EMap<EString*, EList<EString*>*>* headers) {
	this->httpVersion = httpVersion;
	this->statusLine = statusLine;

	// parses the status code from the status line
	EString statusLine_(statusLine);
	this->statusCode = statusLine_.charAt(0) == ' ' ? EInteger::parseInt(statusLine_.substring(1, 4).c_str()) : EInteger
			::parseInt(statusLine_.substring(0, 3).c_str());

	this->headers.clear(); // Clear old.

	if (headers) {
		sp<EIterator<EMapEntry<EString*, EList<EString*>*>*> > iter = headers->entrySet()->iterator();
		while (iter->hasNext()) {
			EMapEntry<EString*, EList<EString*>*>* header = iter->next();
			EList<EString*>* v = header->getValue();
			if (v) {
				EArrayList<EString*>* list = new EArrayList<EString*>(1);
				sp<EIterator<EString*> > it = v->iterator();
				while (it->hasNext()) {
					list->add(new EString(it->next()));
				}
				this->headers.put(new EString(header->getKey()->c_str()), list);
			}
			else {
				this->headers.put(new EString(header->getKey()->c_str()), null);
			}
		}
	}
}
void EHttpDigestAuthLogicHandler::handleResponse(sp<EHttpProxyResponse>& response) {
	this->response = response;

	if (step == 0) {
		if (response->getStatusCode() != 401 && response->getStatusCode() != 407) {
			EString msg("Received unexpected response code (");
			msg << response->getStatusLine() << ").";
			throw EProxyAuthException(__FILE__, __LINE__, msg.c_str());
		}

		// Header should look like this
		// Proxy-Authenticate: Digest still_some_more_stuff
		EString k("Proxy-Authenticate");
		EList<EString*>* values = response->getHeaders()->get(&k);
		EString* challengeResponse = null;

		sp<EIterator<EString*> > iter = values->iterator();
		while (iter->hasNext()) {
			EString* s = iter->next();
			if (s->startsWith("Digest")) {
				challengeResponse = s;
				break;
			}
		}

		if (challengeResponse == null) {
			throw EProxyAuthException(__FILE__, __LINE__, "Server doesn't support digest authentication method !");
		}

		try {
			EString s = challengeResponse->substring(7);
			directives = EStringUtilities::parseDirectives((byte*)s.c_str(), s.length());
		} catch (EException& e) {
			throw EProxyAuthException(__FILE__, __LINE__, "Parsing of server digest directives failed", &e);
		}
		step = 1;
	} else {
		EString msg("Received unexpected response code (");
		msg << response->getStatusLine() << ").";
		throw EProxyAuthException(__FILE__, __LINE__,  msg.c_str());
	}
}
Ejemplo n.º 4
0
void EHttpProxyRequest::setHeaders(EMap<EString*, EList<EString*>*>* headers) {
    if (!headers) return;

    this->headers.clear(); // Clear old.

    sp<EIterator<EMapEntry<EString*, EList<EString*>*>*> > iter = headers->entrySet()->iterator();
    while (iter->hasNext()) {
        EMapEntry<EString*, EList<EString*>*>* header = iter->next();
        EArrayList<EString*>* listCopy = null;
        EList<EString*>* values = header->getValue();
        if (values) {
            listCopy = new EArrayList<EString*>();
            sp<EIterator<EString*> > iter2 = values->iterator();
            while (iter2->hasNext()) {
                listCopy->add(new EString(iter2->next()));
            }
        }
        this->headers.put(new EString(header->getKey()->c_str()), listCopy);
    }
}