2015년 5월 31일 일요일

spring http request body 복사 방법



Interceptor를 이용해서는 불가능하고 filter를 이용하여 복사하여 로깅이 가능하다. 
HttpServletRequestWrapper 클래스를 이용하여 해당 inputsrtream에 대해서 복사를  통하여 새로운 inputstream를 생성해서 전달하는 방법으로 구현이 가능하다.

 - inputstream을 전달 받은 그대로 사용하게 되면 해당 Inputstream의 커서의 이동으로 해당 inpuststream의 재사용이 불가능하여 controller에서 사용시 에러가 발생한다.


하지만 interceptor의 경우 HttpServletRequest를 새로운 Request로 주입이 불가능하여 구현이 불가능한 것으로 보여진다. 

아래의 코드 참고 (reqest에 대해서 로깅하는 클래스 구현)


@Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpRequestWrapper requestWrapper = new HttpRequestWrapper(request);

        log.debug("======================================          REQUEST         ======================================{}" );
        Enumeration<String> requestHeaderNames = requestWrapper.getHeaderNames();
        while (requestHeaderNames.hasMoreElements()) {
            String headerName = requestHeaderNames.nextElement();
            Enumeration<String> headers = requestWrapper.getHeaders(headerName);
            while (headers.hasMoreElements()) {
                String headerValue = headers.nextElement();
                log.debug(" Request HEADER - {} : {} ", headerName, headerValue );
            }
            
        }
        log.debug(" Request METHOD:{} URI:{}  ", requestWrapper.getMethod(), requestWrapper.getRequestURI());
        if(requestWrapper.getMethod().equalsIgnoreCase("POST")||requestWrapper.getMethod().equalsIgnoreCase("PUT")){
            log.debug(" Request Body:  {}", StringHelper.getString(requestWrapper.getInputStream()));
        }
        
        chain.doFilter(requestWrapper, response);
    }
===============================

public class HttpRequestWrapper extends HttpServletRequestWrapper {

/** HTTP request body data */
private byte[] bodyData;

/**
 * @param request
 * @throws IOException
 */
public HttpRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
InputStream is = super.getInputStream();
bodyData = IOUtils.toByteArray(is);
}

/**
 * <pre>
 * getInputStream
 *
 * <pre>
 * @return
 * @throws IOException
 */
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bis = new ByteArrayInputStream(bodyData);
return new ServletImpl(bis);
}
}

class ServletImpl extends ServletInputStream {

private InputStream is;

public ServletImpl(InputStream bis) {
is = bis;
}

@Override
public int read() throws IOException {
return is.read();
}

@Override
public int read(byte[] b) throws IOException {
return is.read(b);
}

}

2015년 5월 12일 화요일

docker panamx 설치

client설치
 - To create new Panamax Templates and deploy Templates and Images locally​

$ curl http://download.panamax.io/installer/ubuntu.sh | bash
vagrant 설치 필요
Installing Virtualbox:
$ sudo apt-get install virtualbox
Installing Vagrant:
$ sudo apt-get install vagrant

Common to both

Install and run Panamax!
$ panamax init

2015년 5월 11일 월요일

dokku 설치

dokku설치

wget https://raw.github.com/progrium/dokku/v0.3.17/bootstrap.sh
sudo DOKKU_TAG=v0.3.17 bash bootstrap.sh
dokku 버전 확인

$ dokku version

/home/dokku/VHOST 해당 파일에 서버 도메인추가

ssh 인증 처리 
클라이언트 에서 키 생성
keygen -t rsa
$ cat ~/.ssh/id_rsa.pub | ssh 54.178.188.117 "sudo sshcommand acl-add dokku 54.178.188.117"
-->해당 명령어로 처리가 안되서 아래와 같이 서버에서 직접 처리 
id_rsa.pub클라이언트 의 키 값을 서버로 이동

cat $HOME/client.pub >> $HOME/.ssh/authorized_keys 해당 키를 권한 부여

cat concall.pub |sshcommand acl-add dokku progrium 해당 키에 대하난 acl-add 처리

git remote add dokku dokku@54.178.188.117:test
git push dokku master

정상 처리 확인


dokku git hook에 대한 내용은 배포된 apps 디렉토리의 hook디렉토리 pre-receive 파일 확인

dokku@apis-dev:~/test123/hooks$ cat pre-receive
#!/usr/bin/env bash
set -e; set -o pipefail;

cat | DOKKU_ROOT="/home/dokku" dokku git-hook test123

git-hook 해당 명령어를 확인하면 docker관련 명령을 통하여 deploy를 진행한다.

dokku 실행 명령어 확인
/var/lib/dokku/plugins/git/commands