/** * Copyright (C) Zhang,Yuexiang (xfeep) * */ package nginx.clojure.clj; import static nginx.clojure.MiniConstants.DEFAULT_ENCODING; import static nginx.clojure.MiniConstants.HEADERS_NAMES; import static nginx.clojure.MiniConstants.NGX_HTTP_CLOJURE_HEADERSO_HEADERS_OFFSET; import static nginx.clojure.MiniConstants.NGX_HTTP_CLOJURE_TEL_HASH_OFFSET; import static nginx.clojure.MiniConstants.NGX_HTTP_CLOJURE_TEL_KEY_OFFSET; import static nginx.clojure.MiniConstants.NGX_HTTP_CLOJURE_TEL_VALUE_OFFSET; import static nginx.clojure.NginxClojureRT.ngx_http_clojure_mem_shadow_copy_ngx_str; import static nginx.clojure.NginxClojureRT.ngx_list_push; import static nginx.clojure.NginxClojureRT.pushNGXInt; import static nginx.clojure.NginxClojureRT.pushNGXString; import clojure.lang.ArraySeq; import clojure.lang.ISeq; public class ResponseUnknownHeaderPusher extends nginx.clojure.UnknownHeaderHolder { public ResponseUnknownHeaderPusher(String name) { super(name, NGX_HTTP_CLOJURE_HEADERSO_HEADERS_OFFSET); } @Override public void push(long h, long pool, Object v) { clear(h); ISeq seq = null; if (v instanceof String) { String val = (String) v; seq = ArraySeq.create(val); }else if (v instanceof ISeq) { seq = (ISeq) v; }else { seq = ArraySeq.create(String.valueOf(v)); } int c = seq.count(); if (c == 0) { return; } long lpname = 0; Long pname = HEADERS_NAMES.get(name); if (pname != null) { lpname = pname; } for (int i = 0; i < c; i++) { String val = (String) seq.first(); seq = seq.next(); if (val != null) { long p = ngx_list_push(h + headersOffset); if (p == 0) { throw new RuntimeException("can not push ngx list for headers"); } pushNGXInt(p + NGX_HTTP_CLOJURE_TEL_HASH_OFFSET, 1); if (lpname != 0) { ngx_http_clojure_mem_shadow_copy_ngx_str(lpname, p + NGX_HTTP_CLOJURE_TEL_KEY_OFFSET); }else { pushNGXString(p + NGX_HTTP_CLOJURE_TEL_KEY_OFFSET, name, DEFAULT_ENCODING, pool); lpname = p + NGX_HTTP_CLOJURE_TEL_KEY_OFFSET; //UNSAFE.getAddress(); } pushNGXString(p + NGX_HTTP_CLOJURE_TEL_VALUE_OFFSET, val, DEFAULT_ENCODING, pool); } } } }